2009-02-09 7 views
4

J'ai un conteneur unitaire et utilise RegisterType pour enregistrer le référentiel et l'implémenteur suivants en utilisant ContainerControlledLifetimeManager.Comment enregistrer des types dans le conteneur principal, mais résoudre dans un conteneur enfant?

public interface IPersonRepository 
{ 
    Person GetByID(ObjectSpace objectSpace, int id); 
} 

En utilisant ce modèle, je suis en mesure d'avoir plusieurs threads (il est une application web) en utilisant la même instance du référentiel en même temps, malgré le fait que chaque fil utilise un ObjectSpace différent (qui est un cache local + mécanisme pour récupérer des objets du DB + une unité de travail, etc.). Mais cela me fait me sentir « sale », et non pas le bon type :-)

Ce que je voudrais vraiment est:

public interface IPersonRepository 
{ 
    Person GetByID(int id); 
} 

Pour cela, je dois créer un conteneur enfant et utiliser RegisterInstance à enregistrez mon ObjectSpace. Cela fonctionne très bien aussi longtemps que je soit:

  1. Inscrivez-IPersonRepository dans le conteneur enfant au lieu
  2. Changer le gestionnaire de vie à TransientLifetimeManager

Je ne veux pas faire non plus. (1) Serait juste trop de travail, je veux vous inscrire une fois dans le conteneur parent, puis pas plus. (2) Cela fonctionnerait mais s'il y a beaucoup de dépendances, alors toutes ces dépendances devraient aussi être transitoires, ce qui entraînerait la création d'un grand nombre d'instances chaque fois que j'aurais besoin du référentiel de personne. Donc, ma question est: Y a-t-il un moyen d'enregistrer le type dans le parent, mais d'avoir une instance de durée de vie du conteneur résolue et stockée dans le conteneur enfant au lieu du conteneur parent? Peut-être qu'il existe un moyen d'utiliser un gestionnaire de durée de vie personnalisé ou quelque chose?

Ce que je voudrais réaliser est la suivante:

UnityContainer unityContainer = new UnityContainer(); 
//Might be a custom manager or something 
unityContainer.RegisterType<IPersonRepository, PersonRepository> 
    (new ContainerControlledLifetimeManager()); 
using (var childContainer = unityContainer.CreateChildContainer()) 
{ 
    childContainer.RegisterInstance<ObjectSpace>(new MyObjectSpace()); 
    //01 Resolves a new instance inside the child container 
    var repository = childContainer.Resolve<IPersonRepository>(); 
    //02 resolves same instance as 01 
    repository = childContainer.Resolve<IPersonRepository>(); 
} 

using (var childContainer = unityContainer.CreateChildContainer()) 
{ 
    childContainer.RegisterInstance<ObjectSpace>(new MyObjectSpace()); 
    //03 Resolves a new instance inside the child container 
    var repository = childContainer.Resolve<IPersonRepository>(); 
    //04 resolves same instance as 03 
    repository = childContainer.Resolve<IPersonRepository>(); //Resolves the same instance 
} 

Répondre

0

Depuis poser la question une nouvelle HierarchicalLifetimeManager a été ajouté à l'unité, ce qui devrait être utilisé lors de l'enregistrement du type.

Questions connexes