【问题标题】:Unity selecting appropriate container统一选择合适的容器
【发布时间】:2017-04-05 13:53:23
【问题描述】:

我正在将 Unity 用于 IoC,并且我希望遵循 How not to do dependency injection 中列出的原则。所以没有全局可用的容器,代码中没有mContainer.Resolve<Type>(),而是构造函数注入。

我的问题是将这些原则应用于多个容器。我的应用程序比较了许多产品(遵循共享模型的对象),每个产品都由它自己的容器配置。

我正在寻找一种方法,让每个“产品”(可以被视为具有许多子对象的对象)使用它自己的容器而不指定该容器。这些容器可以是子容器或命名容器,我认为这没有什么区别?

我已经研究过统一扩展,但还没有找到答案。

【问题讨论】:

  • 每个对象都有不同的容器?我确定我误解了一些东西,但你能澄清一下吗?
  • 我不想要 每个 对象的容器。但是,我有多个“产品”(派生自同一类层次结构但由于其特定细节而表现不同的对象)。每个产品都应该使用它自己的容器来注册它自己的派生类。
  • 好吧,我可以理解出于性能原因拥有多个容器,也许,但是一旦你在来自两个不同容器的两个实体之间建立了链接,恕我直言,你不会玩得很开心。对于同一个基类/抽象类的不同实现,我肯定会使用命名注册,或者在某些情况下使用工厂,如果正确的分辨率只在运行时知道。

标签: unity-container


【解决方案1】:

当我在写这个问题时,在现有代码库中引入依赖注入时,我有点迷失在细节上。这个问题写得不太好,我当时就知道了,但我不知道如何改进我对问题的解释。

话虽如此,这就是我解决问题的方法。

正如我所说,我有一个比较多种产品的应用程序。这些产品可以被认为是同一接口的多个实现。所以我需要同时使用这些多个实现。所有这些产品实际上都是复杂的对象,具有多个依赖项,并且其中许多对象是使用运行时数据构造的,因此不是由构造注入创建的。

我的问题在于不是由构造函数注入创建的对象。在需要构建它们时,我已经失去了当前产品的上下文,并且无法为该产品创建合适的类型。

我为每个产品创建了子容器,以定义每个产品的特定接口需要哪些实现。

在某个时候,我正在创建一个产品实例。这是代码中我要求适当容器的唯一位置(例如:给我产品 X 的子容器)。那时(在产品创建时)我需要做的就是创建一个工厂对象(具有对适当容器的引用),并将其传递给需要动态解析组件的每个对象,即不是通过构造函数注入。

那是缺少的链接。我仍然想知道工厂是否真的需要了解容器,但我可以接受。

我希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多