2010-11-04 35 views
1

我當前實現一些ASP.NET Web應用程序的註冊在我的周圍團結容器包裝的所有庫類和一些輔助服務類:統一:什麼時候註冊

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; 
    } 

這裏是容器如何就是一個例子實例化(我創造每每個請求的容器的新實例,但每次請求只有一個實例):

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

一切工作正常,但什麼一件事是混淆了我很多。我現在有近50班每次創建容器時都已註冊。並非所有的類都實際用於每個請求...

是不是一個性能開銷總是註冊在容器中的一切? 也許我不應該爲每個請求實例化一個新的容器實例(並使用類似容器池的東西)?

什麼是這種情況下的最佳做法建議?

非常感謝。

歡迎任何想法!

回答

2

在我們的內部框架中,我們有一個靜態的Unity容器實例,掛起Global.asax文件,並在Application Start上實例化(並註冊了註冊)。

對於每個請求,我們使用Container.CreateChildContainer()來獲取請求特定的容器,該容器獲得很少的特定於請求的註冊(如果將Unity 2.0與HierarchicalLifetimeManager配合使用,則更少)。請求特定的容器是請求期間使用的容器。

編輯補充:並不是說這一定是最佳做法。但它肯定避免了任何註冊開銷,除了應用程序啓動,我有更大的魚從頂端的角度來炒。

0

我在Application_Start中註冊了Web應用程序所需的一切。我有一個RequestLifetimeManager,如thisSessionLifeTimeManager,以便僅在需要時創建特定於請求和會話的依賴關係:尚未查看與此方法相關的性能或內存問題。我們的策略是在上下文不同時創建子容器,例如在Web服務或後臺任務中。

相關問題