我有 UI ,应用,域和基础设施图层。
在我的基础设施层中,参考域和应用程序层,使用 Ninject 注册两者的服务接口
但我需要在应用程序层中提供 Infrastructure 层中的服务,然后我需要在中引用 Infrastructure 层应用程序层。
问题是基础设施层参考应用程序层,当我在应用程序中引用 Infrastructure 层时>图层显示以下错误:
无法添加对“基础架构”的引用。将此项目作为参考添加将导致循环依赖。
我如何解决这个问题?将应用程序层的Ninject配置放在 Application 层中?我认为这是不正确的,因为我的应用程序层中将实现 Infrastructure 。
答案 0 :(得分:3)
基础结构服务合同应在使用它们的层(域和应用程序)中定义,但在基础结构中实现。请查看Dependency Inversion Principle和Onion Architecture。基础架构层应该依赖于App和Domain。您的域和应用程序不应依赖于基础架构。它们应该依赖于用自己的术语定义的抽象。您可能会发现此answer很有趣。应该在应用程序启动时在所谓的Composition Root中注入此抽象的实际实现。
例如,在您的应用程序中,您可以定义和界面:
ICanNotifyUserOfSuccessfullRegistration
Infrastructure层将引用Application,并将使用SMTP或SMS类实现此接口:
class SmsNotificator : ICanNotifyUserOfSuccessfullRegistration { ... }
稍后将通过DI容器将此实现注入Application。应用程序不依赖于Infrastructure,但仍会使用它,因此 Dependecny Inversion 。我建议阅读Dependency Injection in .NET,即使您使用Java或其他堆栈。
答案 1 :(得分:1)
听起来你的图层太紧密耦合或边界错误。您可以通过引入位于自己项目中的接口来解耦层,并且可以由其他接口引用。