2016-02-25 83 views
0

我从加载到子域内的类(InnerModuleInfoLoader)中引用单例(CacheLayer)。 问题在于,此引用与生活在主域中的其余代码不同。 我想知道是否存在任何方式来规避appDomain的执行隔离以使用单例的实例?如何使用子主AppDomain中的主AppDomain使用相同的单例实例

下面是代码:

AppDomain subdomain = this.CreatedChildDomain(AppDomain.CurrentDomain); 

实例化类从子域

var loader = (InnerModuleInfoLoader) subdomain. 
    CreateInstanceFrom(loaderType.Assembly.Location, loaderType.FullName).Unwrap(); 

内InnerModuleInfoLoader:娄我想这CacheLayer.Instance将是父和子域相同。

var server = CacheLayer.Instance.Get<string>("Server"); 

辛格尔顿

public sealed class CacheLayer 
{ 
    private static readonly CacheLayer instance = new CacheLayer(); 
    private static readonly ObjectCache cache; 
    static CacheLayer() 
    { 
     cache = MemoryCache.Default; 
    } 
    private CacheLayer(){} 
    //More code omitted 
} 

子站点创建

protected virtual AppDomain CreatedChildDomain(AppDomain parentDomain) 
{ 
    Evidence evidence = new Evidence(parentDomain.Evidence); 
    AppDomainSetup setup = parentDomain.SetupInformation; 
    return AppDomain.CreateDomain("ModuleFinder", evidence, setup); 
} 

回答

2

我不知道是否存在任何方式规避的AppDomain的执行隔离使用单实例?

你可以使用MarshalByRefObject,也就是让你的CacheLayer类继承它。

请注意,AppDomains之间的封送处理会导致性能损失。我会考虑每个AppDomain只有两个不同的缓存。

+2

同意,您将使用远程进行通信,每个域之间传递的对象将被序列化等等。更不用说其他远程处理/代理问题。只有当你知道你在做什么时才这样做。 =) –

+0

所以如果MarshalByRefObject是我不喜欢使用它的唯一方法。我将不得不依靠一些其他的东西来跨应用程序域共享数据,也许用户设置在这里很方便。 –