如何在子应用程序域中使用来自主应用程序域的同一单一实例

本文关键字:应用程序域 实例 单一 | 更新日期: 2023-09-27 18:36:23

我引用了子域中加载的类(InnerModuleInfoLoader)中的单例(CacheLayer)。问题在于,此引用与主域中其余代码的实例不同。我想知道是否有任何方法可以绕过 appDomain 的执行隔离以使用单例实例?

这是代码:

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

从子域实例化类

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

内部模块信息加载器:我希望父域和子域的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);
}   

如何在子应用程序域中使用来自主应用程序域的同一单一实例

我想知道是否有任何方法可以绕过 appDomain 的执行隔离以使用单例实例?

您可以使用 MarshalByRefObject ,即使 CacheLayer 类继承自它。

请记住,在 AppDomain 之间封送调用会降低性能。我会考虑为每个应用程序域提供两个不同的缓存。