【发布时间】:2014-01-25 18:29:24
【问题描述】:
我正在尝试在具有以下架构的项目中使用 Simple Injector:
- DAL 层(拥有一个存储库),
- BLL 层(拥有与存储库对话的服务),
- MVC 层(与 BLL 层中的服务对话)。
在向容器注册类和接口时,我遇到了一个问题,Simple Injector 需要我使用其接口注册存储库(因为我在服务层中的类在其构造函数中接受存储库)
所以,实际上,Simple Injector 迫使我在 MVC 层中添加对 DAL 层的引用,这是我非常想避免的。
我的问题是,是否有可能/正确创建一个仅包含 Simple Injector 的外部项目,并且该项目将引用所有其他项目,这样我就可以注册我想要的并仍然保留我的项目抽象?
或者还有其他简单的方法可以解决这个问题吗?
【问题讨论】:
-
好的,谢谢。虽然我还没有完全明白,所以我的 MVC 应用程序(它具有 Composition Root - global.asax)应该引用所有其他项目吗?并且根据所选答案中给出的图表,所有其他项目都没有引用任何其他项目。我怎么能不将我的 BLL 层引用到我的 DAL 层?我需要知道我在构造函数中得到什么类型。还是应该将所有接口放在一个通用项目中?再次感谢。
-
你读过第二个答案(这是我的)吗?组合根必须隐式或显式引用 所有 其他项目;没有办法解决这个问题,这很好,你不应该试图阻止这种情况。由于您决定将合成根和表示层放在同一个程序集中,因此该程序集还引用了所有其他项目。然而,这并不意味着您的演示文稿 layer 引用了所有其他层。
-
特别要仔细阅读最后一部分关于部署工件和逻辑工件的内容。
-
不同之处在于:您的表示层 (PL) 取决于您的 DAL -仅当 PL 的(某些)类(您的控制器、视图等)依赖于 DAL 中的类时. PL 的程序集是否依赖于 DAL 程序集并不重要,只要 PL 的类型不依赖于 DAL 类型即可。
标签: c# asp.net-mvc model-view-controller simple-injector