WebAPI - 在多个项目中使用Unity和Ioc

时间:2017-01-10 13:26:14

标签: c# asp.net-web-api unity-container

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

  • 的WebAPI
    • ICustomerService.cs
  • 商业逻辑
    • CustomerService.cs
    • IDatabaseService.cs
  • 数据库访问
    • DatabaseService.cs

以前,WebAPI项目引用了业务逻辑,然后引用了数据库访问。我试图颠倒这种逻辑。

目前,我在我的WebAPI项目中使用Unity来解析来自业务逻辑层的实现的接口,但是一旦我颠倒了我的逻辑,以便业务逻辑层引用了WebAPI层,Unity注册就不会# 39;没有循环引用的工作:

var container = new UnityContainer();
container.RegisterType<ICustomerService, CustomerService>();
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

当我尝试注册我的类型时,ICustomerService位于顶层项目中,CustomerService对它是不可见的。

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

2 个答案:

答案 0 :(得分:0)

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

另请注意,展开IoC容器跨项目是不好的做法。只有组合根(主)应该知道Unity正在使用的事实。还要避免使用ServiceLocator模式。

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

如果您认为Controller取决于ICustomServiceCustomerService取决于IDatabaseService

另外注意:我会将实现和接口放在同一个项目中。

<强>的WebAPI

  • 控制器

业务逻辑

  • ICustomerService.cs
  • CustomerService.cs

数据库访问

  • IDatabaseService.cs
  • DatabaseService.cs

答案 1 :(得分:0)

你走在正确的道路上。您的控制器应该在构造函数中注入icustomerservice实现,服务应该在其构造函数中注入idatabaseservice。

public FooController(ICustomerService svc)
...
public CustomerService(IDatabaseService db)
...

并添加数据库DI config

container.RegisterType<IDatabaseService, DatabaseService>();
container.RegisterType<ICustomerService, CustomerService>();

当您准备好使用新实现时,只需更改配置中的引用以实例化新实现。

接口应该在一个项目中,并且实现应该在一个项目中。新旧实现应共享一个通用接口。