【问题标题】:How to resolve Dependency within Dependency如何解决依赖关系中的依赖关系
【发布时间】:2013-07-25 05:01:46
【问题描述】:

我在一个解决方案中有 4 个项目

  • DAL_Project
  • BLL_项目
  • Interface_Project
  • WebApi_Project

Interface_Project有两个接口ICar_DALICar_BLL

DAL_Project 有一个实现 ICar_DAL

的类 Car_DAL

BLL_Project 有一个实现 ICar_BLL 的类 Car_BLL,其构造函数接受 ICar_DAL

WebApi_Project 有一个 api 控制器 CarApiController,其构造函数接受 ICar_BLL

WebApi Controller 的构造函数的依赖解析是由 Unity.WebApi 在 Bootstrapper.cs 中使用 this 完成的:

container.RegisterType<ICar_BLL, Car_BLL>();

如果我的 Car_BLL 在其构造函数中进一步不需要 ICar_DAL,这将起作用。

为了让它工作,我可以做这样的事情:

container.RegisterType<ICar_BLL, Car_BLL>();
container.RegisterType<ICar_DAL, Car_DAL>();

但这意味着我需要在我的 WebApi_Project 中添加对 DAL_Project 的引用,这是我永远不想做的事情。 DAL_Project 只能由 BLL_Project

推荐

我该如何解决这个问题?

【问题讨论】:

标签: dependency-injection asp.net-web-api tdd unity-container


【解决方案1】:

但这意味着我需要在我的 WebApi_Project 这是我永远不想做的事情。

哦,如果您不想这样做,您似乎对如何完成 Dependency 有一些误解。 DI 容器配置在应用程序的最外层,实际上是主机。它也被称为Composition Root。在您的情况下,这是您的 Web API 的托管应用程序。如果您使用 ASP.NET 来托管您的 Web API,那么这是进行组合根目录和引用所有其他基础项目的正确位置。

就个人而言,在复杂的项目中,我倾向于使用ProjectName.Composition 类库作为组合根。这是我配置我的 DI 容器的地方,这是引用所有其他容器的项目 - 因为显然为了配置您的 DI 根,您需要所有相关的项目和实现。然后在宿主应用程序中引用这个.Composition 程序集,并在宿主应用程序的Initialize 方法中调用Bootstrapper.Initialize 方法。

  • 在 ASP.NET 主机的情况下,Application_Start in Global.asax
  • 如果是桌面应用程序或自托管,则 Main 方法是入口点。

【讨论】:

  • 谢谢达林。我想我明白了你对 Composition Root 的看法。我会阅读更多关于它的信息。如果 Composition Root 应该是我的 Web Api 项目,你认为离开 Web Api 项目只做 Composition Root 工作,并在一个新的类库项目中将控制器从其中取出是一个好主意吗?那么所有项目都将只有对 InterfaceProject 的引用,而 WebAPI 项目将引用每个项目作为其 Composition Root。你认为这是一个正确的架构吗?
  • 不要忘记层是逻辑分离,而不是物理分离。层是为了降低复杂性,程序集是为了创建部署单元。所以从分层的角度来看,在同一个组件中有多个层是可以的。组合根 (CR) 是它自己的一层,但由于 CR 是特定于最终应用程序的,因此它将始终与您的 WebAPI 应用程序一起部署。即使您的 WebAPI 程序集引用了所有其他程序集,您的 Web API UI 层也不会引用所有其他层。另一方面,CR 层将引用所有其他层。
  • 这是否意味着我正在朝着正确的方向前进,将控制器和视图移出 web api 项目,将它们自己的单独项目中。并将 web api 项目保留为 CR 层?我也猜想同样可以应用于 MVC Web 应用程序,其中 Web 应用程序是 CR,其控制器和视图 (UI) 位于不引用所有其他项目的单独项目中。最后一件事:将我的所有接口保存在单独的接口项目中是个好主意,对吧?
猜你喜欢
  • 2014-12-18
  • 1970-01-01
  • 2014-09-06
  • 2012-01-31
  • 2023-03-11
  • 2016-02-16
  • 2017-02-20
相关资源
最近更新 更多