2016-02-25 1 views
0

J'ai une référence à un singleton (CacheLayer) d'une classe (InnerModuleInfoLoader) chargée dans un domaine enfant. Le problème est que cette référence n'est pas la même instance que pour le reste du code vivant dans le domaine principal. Je me demande s'il existe un moyen de contourner l'isolation d'exécution de appDomain pour utiliser l'instance du singleton?Comment utiliser la même instance de singleton depuis le domaine principal principal dans childdom

Voici le code:

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

classe instanciation de sous-domaine

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

intérieur InnerModuleInfoLoader: Bellow Je voudrais que CacheLayer.Instance sera le même pour les parents et les sous-domaines.

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

Singleton

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 
} 

de création de sous-domaine

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

Répondre

2

Je me demande s'il existe un moyen de contourner l'isolement d'exécution de appdomain d'utiliser l'instance du singleton?

Vous pouvez utiliser MarshalByRefObject, c'est-à-dire que votre classe CacheLayer en héritera. Gardez à l'esprit que les appels de marshaling entre AppDomains sont assortis d'une pénalité de performance. Je considérerais juste avoir deux caches de différence pour chaque AppDomain.

+2

accepté, vous utiliseriez la communication à distance, chaque objet passé entre les domaines serait sérialisé, etc. pour ne pas mentionner les autres problèmes d'accès à distance/proxy. Faites-le seulement si vous savez ce que vous faites. =) –

+0

Donc, si MarshalByRefObject est le seul moyen que je préfère ne pas l'utiliser. Je vais devoir compter sur d'autres choses pour partager des données sur l'ensemble des domaines, peut-être que les paramètres utilisateur sont utiles ici. –