用于在层项目中放置依赖注入相关代码的最佳层

时间:2012-08-20 18:32:16

标签: architecture dependency-injection domain-driven-design n-tier-architecture onion-architecture

我打算在我的新应用程序中使用洋葱架构。

解决方案层次结构如下

  • 域 - 服务和存储库的所有接口 定义。
  • 基础设施 - 这是所有数据访问的层 放置。这些类通常实现在中定义的接口 域。
  • Web - 这是我的应用程序的演示文稿部分。内 同一层我有单独的文件夹来实现 域中定义的服务。

我的原则是使用依赖注入来进行依赖项解析。最初我想到将DI相关代码放在基础设施中。但问题是,当我映射服务时,它会导致循环引用,因为实际的服务实现在我的Web项目中,并且Web项目已经引用了基础结构。我无法将具体服务移动到另一层,因为它违反了洋葱架构(传递依赖)的原则。

任何领导都表示赞赏。

1 个答案:

答案 0 :(得分:2)

答案取决于您如何定义“DI相关代码”。

如果将DI定义为一组促进松散耦合和关注点分离的原则和模式,那么这些模式(例如构造函数注入)应该应用于应用程序的所有层。就像您将应用SOLID原则和其他OO最佳实践一样。

如果DI指的是直接依赖于此容器的特定容器和代码,则此代码应仅存在于应用程序的入口点。在您的方案中,这是一个Web层。或者如果这是一个控制台应用程序,它可以是'主'程序。此部分应用程序称为Composition Root

  

很容易理解每​​个类应该通过其构造函数来要求它的依赖关系,但这推动了将类与其依赖关系组合到第三方的责任。应该在哪里?在我看来,大多数人都渴望尽早撰写,但正确的答案是:

     

尽可能接近应用程序的入口点。

     

这个地方被称为应用程序的组合根,并且定义如下:

     

组合根是应用程序中(最好)唯一的位置,其中模块组合在一起。

     

这意味着所有应用程序代码仅依赖于构造函数注入(或其他注入模式),但从不编写。只有在应用程序的入口点才是最终组成的整个对象图。