代码之家  ›  专栏  ›  技术社区  ›  Budda

统一:什么时候登记

  •  1
  • Budda  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  2
  •   Kirk Clawson    15 年前

    在我们的内部框架中,有一个Unity容器的静态实例挂起全球.asax文件,并在应用程序启动时实例化(并填充注册)。

    在每次请求时,我们使用Container.CreateChildContainer容器()以获取一个特定于请求的容器,该容器只获得很少的特定于请求的注册(如果将Unity 2.0与HierarchyCallyTimeManager一起使用,则更少)。请求特定的容器是请求期间使用的容器。

        2
  •  0
  •   onof    15 年前

    我在“应用程序启动”中注册web应用程序所需的所有内容。我有一个 RequestLifetimeManager this 以及 SessionLifeTimeManager

    推荐文章