我在解决方案中有4个项目
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
引用我该如何解决这个问题?
答案 0 :(得分:2)
但这意味着我需要在我的DAL_Project中添加引用 WebApi_Project这是我永远不想做的事情。
哦,如果你不想这样做,你似乎对如何做依赖有一些误解。 DI容器配置在应用程序的最外层,实际上是主机。它也被称为Composition Root。在您的情况下,这是您的Web API的托管应用程序。如果您使用ASP.NET来托管Web API,那么这是组合根目录和引用所有其他底层项目的正确位置。
就复杂项目而言,我倾向于拥有一个ProjectName.Composition
类库,它将我作为组合根。这是我配置我的DI容器的地方,这是引用所有其他项目的项目 - 显然,为了配置您的DI根,您需要所有依赖项目和实现。然后,此.Composition
程序集将在托管应用程序中引用,并在托管应用程序的Initialize方法中调用Bootstrapper.Initialize
方法。
Application_Start
Global.asax
Main
方法的入口点。