我打算在我的新应用程序中使用洋葱架构。
解决方案层次结构如下
我的原则是使用依赖注入来进行依赖项解析。最初我想到将DI相关代码放在基础设施中。但问题是,当我映射服务时,它会导致循环引用,因为实际的服务实现在我的Web项目中,并且Web项目已经引用了基础结构。我无法将具体服务移动到另一层,因为它违反了洋葱架构(传递依赖)的原则。
任何领导都表示赞赏。
答案 0 :(得分:2)
答案取决于您如何定义“DI相关代码”。
如果将DI定义为一组促进松散耦合和关注点分离的原则和模式,那么这些模式(例如构造函数注入)应该应用于应用程序的所有层。就像您将应用SOLID原则和其他OO最佳实践一样。
如果DI指的是直接依赖于此容器的特定容器和代码,则此代码应仅存在于应用程序的入口点。在您的方案中,这是一个Web层。或者如果这是一个控制台应用程序,它可以是'主'程序。此部分应用程序称为Composition Root:
很容易理解每个类应该通过其构造函数来要求它的依赖关系,但这推动了将类与其依赖关系组合到第三方的责任。应该在哪里?在我看来,大多数人都渴望尽早撰写,但正确的答案是:
尽可能接近应用程序的入口点。
这个地方被称为应用程序的组合根,并且定义如下:
组合根是应用程序中(最好)唯一的位置,其中模块组合在一起。
这意味着所有应用程序代码仅依赖于构造函数注入(或其他注入模式),但从不编写。只有在应用程序的入口点才是最终组成的整个对象图。