【问题标题】:How to use the same singleton instance from main appdomain in childs appdomain如何在子 appdomain 中使用来自主 appdomain 的相同单例实例
【发布时间】:2016-02-25 16:22:29
【问题描述】:

我从加载在子域中的类 (InnerModuleInfoLoader) 中引用了单例 (CacheLayer)。 问题是这个引用与主域中的其他代码不同。 不知道有没有办法绕过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);
}   

【问题讨论】:

    标签: c# .net appdomain


    【解决方案1】:

    不知道有没有办法绕过appDomain的执行隔离来使用单例的实例?

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

    请记住,AppDomain 之间的封送调用会降低性能。我会考虑为每个 AppDomain 设置两个不同的缓存。

    【讨论】:

    • 同意,您将使用远程处理进行通信,域之间传递的每个对象都将被序列化等等。更不用说其他远程处理/代理问题了。只有在你知道自己在做什么的情况下才这样做。 =)
    • 因此,如果 MarshalByRefObject 是我不想使用它的唯一方法。我将不得不依靠其他一些东西来跨 appdomain 共享数据,也许用户设置在这里很方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多