2010-11-04 61 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服务或后台任务中。