【问题标题】:Ioc container placement within enterprise application企业应用程序中的 Ioc 容器放置
【发布时间】:2011-11-06 12:24:50
【问题描述】:

我最近一直在研究 Ioc 容器和 AOP,我对这些概念感到非常惊讶。然而,我正在努力决定如何以及在何处实施容器。

以下文章建议在“应用程序入口点”中实现容器:

现在 - 我的思想实验应用程序将包含多个 Visual Studio 项目(一个用于数据访问,winforms 应用程序)。假设我想使用 AOP 来使用 Log4net 进行日志记录,所以我在 Ioc 容器中设置了 log4net。 所以 WinForms 应用程序在入口点,这就是 Ioc 容器应该去的地方。

问题是:如果我想在我的数据访问项目/层中记录内容,我应该添加一个 引用我的 winforms 应用程序,从那里获取 ioc 容器,从中获取 log4net 实例并将其用于日志记录?

这意味着我的数据层依赖于 winforms 应用程序,这是不对的。我如何将容器放在解决方案中类似于“通用”项目。这样,所有相关项目(数据访问/winformsa 等)都可以访问容器。 去这里的正确方式是什么?

【问题讨论】:

    标签: visual-studio architecture inversion-of-control ioc-container enterprise


    【解决方案1】:

    您的应用程序的Composition Root 将是Windows 窗体项目。这是唯一的项目,它应该具有对 DI 容器的引用。

    在所有其他项目中,依赖项应该通过 Constructor Injection 注入。所有体面的 DI 容器都理解这种模式,并使用它来自动连接来自 Composition Root 的依赖项。

    【讨论】:

    • 'only' 是一个强有力的词 :) 模块/注册表/安装程序可以帮助保持理智并鼓励多个 IOC 感知项目。但作为第一步,进入单个项目是正确的去做。
    【解决方案2】:

    我已将我的容器抽象为一个单独的程序集,所有其他程序集/项目都取决于其服务引用。容器项目只有一个类和 - 或多或少 - 一个方法:

    public class MySpecialContainer
    {
         public T Resolve<T>() { // ... Get stuff from the IoC container }
    }
    

    容器构建要么发生在 MySpecialContainer 的 ctor 中,要么只是添加另一个方法,如 Initialize() 或类似的方法。

    唯一的问题是,当我使用 Autofac 并且有一个 Windows 服务和 ASP.Net 项目都需要容器时,这种方法对我来说失效了。每个都有其对范围生命周期服务的特定要求:Windows 服务 - PerLifetimeScope、ASP.Net - PerHttpRequest。我想我可以在 MySpecialContainer 中传递一个参数来表示要配置的场景,但我决定直接采用 Autofac 依赖项。

    好消息是,如果您坚持使用 ctor 注入,那么您可以非常轻松地更换各种容器实现 - Autofec、Ninject、StructureMap 等。

    【讨论】:

    • 那么基本上你已经使用容器创建了服务定位器了?这是一种反模式。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多