我有一个包含多个项目的解决方案 - 类似于以下内容:
以前,WebAPI项目引用了业务逻辑,然后引用了数据库访问。我试图颠倒这种逻辑。
目前,我在我的WebAPI项目中使用Unity来解析来自业务逻辑层的实现的接口,但是一旦我颠倒了我的逻辑,以便业务逻辑层引用了WebAPI层,Unity注册就不会# 39;没有循环引用的工作:
var container = new UnityContainer();
container.RegisterType<ICustomerService, CustomerService>();
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
当我尝试注册我的类型时,ICustomerService位于顶层项目中,CustomerService对它是不可见的。
我已经阅读了关于有一个单独的项目来容纳统一配置,但这也会创建一个循环引用。我怎样才能做到这一点?
答案 0 :(得分:0)
为什么要反转?在我看来,这是唯一的方式。 WebAPI项目是主要入口(如果它是自托管的,它将包含programs.cs)。此项目还将包含用于设置依赖项注入和解析类型的组合根(这由WebAPI处理)。另见Composition Root。你能解释一下这样做的好处吗?
另请注意,展开IoC容器跨项目是不好的做法。只有组合根(主)应该知道Unity正在使用的事实。还要避免使用ServiceLocator模式。
不同项目中的对象应该只有一个引用/依赖项,例如构造函数。
如果您认为Controller
取决于ICustomService
,CustomerService
取决于IDatabaseService
。
另外注意:我会将实现和接口放在同一个项目中。
<强>的WebAPI 强>
业务逻辑
数据库访问
答案 1 :(得分:0)
你走在正确的道路上。您的控制器应该在构造函数中注入icustomerservice实现,服务应该在其构造函数中注入idatabaseservice。
public FooController(ICustomerService svc)
...
public CustomerService(IDatabaseService db)
...
并添加数据库DI config
container.RegisterType<IDatabaseService, DatabaseService>();
container.RegisterType<ICustomerService, CustomerService>();
当您准备好使用新实现时,只需更改配置中的引用以实例化新实现。
接口应该在一个项目中,并且实现应该在一个项目中。新旧实现应共享一个通用接口。