2010-11-04 4 views
1

Ma mise en œuvre actuelle de certaines applications Web ASP.NET enregistre les classes tous les référentiels et certaines classes de services d'aide dans mon enveloppe autour de conteneur d'unité:Unité: quoi et quand pour enregistrer

public class MyUnityContainer : UnityContainer 
{ 
    public MyUnityContainer() 
    { 
     string strConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 
     _context = new MyDataClassesDataContext(strConnectionString); 

     this 
      .RegisterInstance(typeof(CMCoreDataClassesDataContext), _context, new ContainerControlledLifetimeManager()) 
      ; 

     // Register Repository classes 
     this 
      .RegisterType<IBlockedRegistrationRepository, BlockedRegistrationRepository>() 
      .RegisterType<ICmOptionRepository, CmOptionRepository>() 
      .RegisterType<ICommandExecutionLogRepository, CommandExecutionLogRepository>() 
     ... 
    } 

    public static T GetContainer<T>(IDictionary items) where T : class, IUnityContainer, new() 
    { 
     T container; 
     lock (Lock) 
     { 
      if (items.Contains(UnityKey) == false) 
      { 
       container = new T(); 
       items.Add(UnityKey, container); 
      } 
      else 
      { 
       container = items[UnityKey] as T; 
      } 
     } 

     return container; 
    } 

Voici un exemple comment récipient est instancié (je crée une nouvelle instance du conteneur pour chaque demande, mais une seule instance par demande):

 using (IUnityContainer container = MyUnityContainer.GetContainer<McaUnityContainer>(HttpContext.Current.Items)) 
     { ... } 

Tout fonctionne très bien, mais ce que une chose me confond beaucoup: j'ai maintenant presque 50 classes été enregistré chaque fois que le conteneur est créé. Toutes les classes ne sont pas réellement utilisées pour chaque requête ...

N'est-ce pas un surcoût lié à la performance de TOUJOURS enregistrer tout dans un conteneur? Je ne devrais probablement pas instancier une nouvelle instance de conteneur pour chaque requête (et utiliser quelque chose comme un pool de conteneurs)?

Qu'est-ce qu'une recommandation de meilleure pratique pour ce cas?

Merci beaucoup.

Toutes les pensées sont les bienvenues!

Répondre

2

Dans notre structure interne, nous avons une instance statique du conteneur Unity qui suspend le fichier Global.asax et est instanciée (et remplie d'enregistrements) au démarrage de l'application. À chaque demande, nous utilisons Container.CreateChildContainer() pour obtenir un conteneur spécifique à la requête qui reçoit très peu d'enregistrements spécifiques à la demande (encore moins si vous utilisez Unity 2.0 avec HierarchicalLifetimeManager). Le conteneur spécifique à la requête est ce qui est utilisé pendant la requête.

Edité pour ajouter: Cela ne signifie pas nécessairement que ce soit une bonne pratique. Cependant, il évite tout frais généraux d'enregistrement, sauf pour le démarrage de l'application où j'ai plus de poissons à frire à partir d'une perspective de frais généraux.

0

J'enregistre tout ce dont l'application Web a besoin dans Application_Start. J'ai un RequestLifetimeManager comme this et un SessionLifeTimeManager, pour que les dépendances spécifiques à la requête et à la session soient créées seulement quand cela est nécessaire: je n'ai pas encore vu les problèmes de performances ou de mémoire liés à cette approche. Notre stratégie consiste à créer un conteneur enfant lorsque le contexte est différent, par exemple dans les services Web ou les tâches d'arrière-plan.

Questions connexes