C# WebAPI-在多个项目中使用Unity与Ioc

C# WebAPI-在多个项目中使用Unity与Ioc,c#,asp.net-web-api,unity-container,C#,Asp.net Web Api,Unity Container,我有一个包含多个项目的解决方案-类似于以下内容: WebAPI iccustomerservice.cs 业务逻辑 CustomerService.cs IDatabaseService.cs 数据库访问 DatabaseService.cs 以前,WebAPI项目引用了业务逻辑,然后又引用了数据库访问。我试图颠倒这种逻辑 目前,我在我的WebAPI项目中使用Unity来解决与业务逻辑层实现的接口,但是,一旦我反转了我的逻辑,以便业务逻辑层有一个对WebAPI层的引用,Unity

我有一个包含多个项目的解决方案-类似于以下内容:

  • WebAPI
    • iccustomerservice.cs
  • 业务逻辑
    • CustomerService.cs
    • IDatabaseService.cs
  • 数据库访问
    • DatabaseService.cs
以前,WebAPI项目引用了业务逻辑,然后又引用了数据库访问。我试图颠倒这种逻辑

目前,我在我的WebAPI项目中使用Unity来解决与业务逻辑层实现的接口,但是,一旦我反转了我的逻辑,以便业务逻辑层有一个对WebAPI层的引用,Unity注册在没有循环引用的情况下就无法工作:

var container = new UnityContainer();
container.RegisterType<ICustomerService, CustomerService>();
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
var container=newunitycontainer();
container.RegisterType();
GlobalConfiguration.Configuration.DependencyResolver=新的UnityDependencyResolver(容器);
当我尝试注册我的类型时,ICCustomerService将在顶级项目中使用,CustomerService对它是不可见的


我已经读过关于有一个单独的项目来容纳unity配置,但这也会创建一个循环引用。我怎样才能做到这一点呢?

你为什么要颠倒它?在我看来,这是唯一的办法。WebAPI项目是主入口(如果它是自托管的,它将包含一个programs.cs)。此项目还将包含用于设置依赖项注入和解析类型的组合根(这由WebAPI处理)。另见。你能向我解释一下这样做的好处吗

同时也要注意,将国际奥委会集装箱交叉项目分散开来是不好的做法。只有合成根(main)应该知道使用统一的事实。还要避免使用ServiceLocator模式

不同项目中的对象应该只有一个引用/依赖关系,例如通过构造函数

如果您认为
控制器
依赖于
iccustomservice
客户服务
依赖于
IDatabaseService

另请注意:我将把实现和接口放在相同的项目中

WebAPI

  • 控制器
业务逻辑

  • iccustomerservice.cs
  • CustomerService.cs
数据库访问

  • IDatabaseService.cs
  • DatabaseService.cs

    • 你走的是正确的道路。控制器应在构造函数中注入ICCustomerService实现,服务应在其构造函数中注入idatabaseservice

      public FooController(ICustomerService svc)
      ...
      public CustomerService(IDatabaseService db)
      ...
      
      并添加数据库DI config

      container.RegisterType<IDatabaseService, DatabaseService>();
      container.RegisterType<ICustomerService, CustomerService>();
      
      container.RegisterType();
      container.RegisterType();
      
      当您准备好使用新的实现时,只需更改配置中的引用即可实例化新的实现


      接口应该一起在一个项目中,实现应该一起在一个项目中。新旧实现应该共享一个公共接口。

      感谢您的评论,我之所以希望这样做是为了支持业务逻辑和底层的灵活性。我把它放在一个正在变化的ERP系统之上,这两个系统将并行运行一段时间。我希望依赖关系注入器是智能的,以便在服务从一个系统移动到另一个系统时,我可以将逻辑放在适当的位置,以了解“您使用CustomerServiceA.cs”和“您使用CustomerServiceB.cs”-也许我的想法是错误的?那么您希望能够在不重新编译的情况下更改业务逻辑层吗?很快就会有第二个业务逻辑和数据库访问层,我希望能够选择以编程方式使用哪一层,但是webapi不应该知道它将使用哪种实现。通常,您会使用XML配置之类的东西来实现这一点。看见如果这是一项要求,那么实现和接口不应该在同一个dll中。我也可以推荐这本书: