【问题标题】:Should I separate IoC binding seperation by project我应该按项目分离 IoC 绑定分离吗
【发布时间】:2015-03-09 10:02:31
【问题描述】:

我是领域驱动设计架构的新手。我的项目解决方案是这样的:

  • 演示文稿(网络)
  • 应用层
  • 查询层
  • QueryHandlerLayer
  • 数据层

我从文章中读到这些分离是为了隔离工作。

Presentation 项目参考ApplicationLayer 但不引用QueryLayer、QueryHandlerLayer和DataLayer。

但我正在使用 IoC 容器并将类型绑定到接口。

  • container.Bind(数据接口).To(数据类);
  • container.Bind(查询接口).To(查询类);

我可以在 PresentationLayer 上做到这一点。但是现在所有的项目都会添加对表示层的引用。

这是关于架构的问题吗?或者我可以为所有层分离 IoC 容器绑定吗?

【问题讨论】:

    标签: c# oop design-patterns domain-driven-design ninject


    【解决方案1】:

    使用 DI 就是编写应用程序。一个应用程序可能有多个层,但它们仍然是同一个应用程序的一部分,并且必须组合在一起。

    编写应用程序的适当位置在composition root,应尽可能靠近应用程序的入口点。

    对于编写多层应用程序,基本上有 3 种常见的建议,它们都是完全可以接受的。

    1. 不要将层分成物理组件。
    2. 在表示层中编写应用程序,并从表示层引用所有其他层。
    3. 创建引用所有其他图层的单独合成图层。

    对于第 3 个选项,您应该记住,组合层应该驱动而不是由应用程序的其余部分驱动。

    请参阅this answer,了解此引用背后的原因以及为什么您确实从组合根目录引用每个库以避免紧密耦合很重要。或者,如前所述,您可以使用后期绑定来编写您的应用程序,而无需直接引用程序集,前提是您的部署脚本复制了 DLL。

    【讨论】:

      【解决方案2】:

      我认为我在最近的使用中学到的最重要的事情是,在基础层面上,DI 是关于注入依赖项。这是一个相当多余的描述,所以让我详细说明:

      DI 始于设计。一切都应该通过构造函数或某种工厂提供它需要的东西。这就是接口是你最好的朋友的地方。完成此操作后,大部分工作就完成了。假设某些项目是共享的,您现在已将所有工作委托给使用它的任何人。不过,这可能是旧闻了。

      接下来,如果您可以控制容器,请考虑创建一个默认模块,在 Ninject 的情况下为 NinjectModule。为每个应用层创建其中一个。可以说,这将形成“指令”,让位于程序最高级别的容器将所有部分放在一起。

      这都可以通过反射技巧加载,其中有大量信息,like this

      然后只需将所有这些绑定“说明手册”加载到组合根目录(通常在应用程序中)就可以了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多