【问题标题】:Simple Injector in its own projectSimple Injector 在自己的项目中
【发布时间】: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


【解决方案1】:

DI 容器(例如您的 Simple Injector)只能从 Composition Root 中引用。所有其他模块都不应引用容器。

您可以在此处阅读有关合成根的更多信息:

http://blog.ploeh.dk/2011/07/28/CompositionRoot/

更重要的是 DI Container 应该完全从 Composition Root 内使用 Register Resolve Release 模式应用。 更多关于此模式的信息:

http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/

【讨论】:

  • 您的文章所说的正是我所做的,我有一个 MVC 应用程序,因此我将 Register 命令放在 global.asax 中(实际上,我使用 SimpleInjector 快速安装,因此它使用外部类为此,它确实使用 global.asax )但是,这并不能解决我的问题,因为即使我在 global.asax 中编写注册,我仍然需要从我的 MVC 层到我的 DAL 层的引用。
猜你喜欢
  • 1970-01-01
  • 2015-04-02
  • 2023-03-11
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多