0

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

  • DAL_项目
  • BLL_项目
  • 接口_项目
  • 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 中使用的:

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 引用

我该如何解决这个问题?

4

1 回答 1

2

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

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

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

  • 在 ASP.NET 主机的情况Application_StartGlobal.asax
  • 在桌面应用程序或自托管的情况下,这将Main是作为入口点的方法。
于 2013-07-24T21:01:46.403 回答