基础设施服务合同应该在哪里?

时间:2011-09-30 16:56:17

标签: .net architecture dependency-injection domain-driven-design

我有 UI 应用基础设施图层。

在我的基础设施层中,参考应用程序层,使用 Ninject 注册两者的服务接口

但我需要在应用程序层中提供 Infrastructure 层中的服务,然后我需要在中引用 Infrastructure 层应用程序层。

问题是基础设施层参考应用程序层,当我在应用程序中引用 Infrastructure 层时>图层显示以下错误:

无法添加对“基础架构”的引用。将此项目作为参考添加将导致循环依赖。

我如何解决这个问题?将应用程序层的Ninject配置放在 Application 层中?我认为这是不正确的,因为我的应用程序层中将实现 Infrastructure

2 个答案:

答案 0 :(得分:3)

基础结构服务合同应在使用它们的层(域和应用程序)中定义,但在基础结构中实现。请查看Dependency Inversion PrincipleOnion 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)

听起来你的图层太紧密耦合或边界错误。您可以通过引入位于自己项目中的接口来解耦层,并且可以由其他接口引用。