【问题标题】:Unity child containers and extensionsUnity 子容器和扩展
【发布时间】:2014-03-28 21:01:43
【问题描述】:

我正在开发一个使用 Unity 作为其 DI 容器的模块化应用程序。在启动期间,应用会向统一容器添加一个扩展(称为 MyUnityExtension)。

现在,我希望向应用程序添加一个新模块,该模块使用自己的统一容器(我假设是父容器的子容器),并且该子容器没有定义扩展。

  1. 如果我创建父容器的子容器,子容器是否也会继承 MyUnityExtension?我搜索并发现一些旧信息表明它不会但想确定。

  2. Unity 有一个功能,即使类未注册,您也可以请求依赖于这些类的具体类型的实例,Unity 会弄清楚如何创建它们并为您提供实例(找到该信息here)。在我的新模块中,我希望 Unity 在进行任何解析时只检查我之前创建的子容器,而不考虑父容器。由于 Unity 自己进行解析(因为尚未注册该类),因此我看不到挂钩此过程的方法,而且我不知道当子容器存在时该过程如何更改。

我是 Unity 新手,所以不确定这是否可行。

【问题讨论】:

  • 如果您不想使用父注册,为什么要使用子容器 (CreateChildContainer()) 而不是仅使用新容器 (new UnityContainer())?您希望使用子容器有什么好处?

标签: c# unity-container


【解决方案1】:

好吧,首先here 是一个非常好的 Unity 教程。

然后
AFAIK 当您创建子容器时,这是确切的行为,但如果您想确保在 IUnityContainer 中定义了一个名为 RemoveAllExtensions 的方法。此方法也删除了所有默认扩展。因此,在那之后,您必须使用您的扩展配置容器,并且可能是您想要的默认扩展。
这也是你的第二点。使用扩展,您基本上可以将任何逻辑插入到 UnitContainer 生命周期中,例如。处理不同的解决方法等。 如果您想了解更多关于扩展的信息,这里有一些链接:

希望这能让你走上正确的道路;)

【讨论】:

    【解决方案2】:

    这取决于您使用的对象生命周期,假设如果您使用的是 heirarchicallifetimemanager,那么子容器将使用相同的对象而不是创建新的对象,如果您使用的是 ContainerControlledLifetimeManager,那么该对象将不会在两者之间共享父母和孩子。

    【讨论】:

      【解决方案3】:
      var childContainer = unity.CreateChildContainer();
      
      childContainer.RegisterType<IExtended, ExtendedImp>();
      
      var yourClass = childContainer.Resolve<SomeClassToResolve>();
      

      【讨论】:

        猜你喜欢
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 2016-06-10
        • 1970-01-01
        相关资源
        最近更新 更多