如何解决依赖关系中的依赖关系

时间:2013-07-24 17:41:48

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

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

  • DAL_Project
  • BLL_Project
  • Interface_Project
  • WebApi_Project

Interface_Project 有两个接口 ICar_DAL ICar_BLL

DAL_Project 有一个 Car_DAL 类实现 ICar_DAL

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

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

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

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

引用

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

  

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

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

就复杂项目而言,我倾向于拥有一个ProjectName.Composition类库,它将我作为组合根。这是我配置我的DI容器的地方,这是引用所有其他项目的项目 - 显然,为了配置您的DI根,您需要所有依赖项目和实现。然后,此.Composition程序集将在托管应用程序中引用,并在托管应用程序的Initialize方法中调用Bootstrapper.Initialize方法。

  • 如果ASP.NET主机在Application_Start
  • 中为Global.asax
  • 如果是桌面应用程序或自我主机,那么它将是Main方法的入口点。