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

.net 基础设施服务合同应该在哪里?,.net,architecture,dependency-injection,domain-driven-design,.net,Architecture,Dependency Injection,Domain Driven Design,我有UI、应用程序、域和基础架构层 在我的基础架构层,引用域和应用层,使用Ninject注册两者的服务接口 但是我需要在我的应用层中的基础结构层中的服务,然后我需要在我的应用层中引用基础结构层 问题是基础架构层引用应用程序层,当我在应用程序层中引用基础架构层时,会显示以下错误: 无法添加对“基础架构”的引用。添加此项目作为参考将导致循环依赖。 我如何解决这个问题?将应用层的Ninject配置放在应用层中?我认为这是不正确的,因为我将在我的应用层中实现基础设施。听起来您的层要么耦合得太紧,要么边界

我有UI、应用程序、域和基础架构层

在我的基础架构层,引用域和应用层,使用Ninject注册两者的服务接口

但是我需要在我的应用层中的基础结构层中的服务,然后我需要在我的应用层中引用基础结构层

问题是基础架构层引用应用程序层,当我在应用程序层中引用基础架构层时,会显示以下错误:

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


我如何解决这个问题?将应用层的Ninject配置放在应用层中?我认为这是不正确的,因为我将在我的应用层中实现基础设施。

听起来您的层要么耦合得太紧,要么边界错误。您可以通过引入位于各自项目中且可供其他项目引用的接口来解耦各层。

基础设施服务合同应在使用它们的层(域和应用程序)中定义,但应在基础设施中实现。看一看,然后。基础架构层应取决于应用程序和域。您的域和应用程序不应依赖于基础架构。它们应该依赖于用自己的术语定义的抽象。你可能会发现这很有趣。这个抽象的实际实现应该在应用程序启动时以所谓的方式注入

例如,在您的应用程序中,您可以定义和接口如下:

ICanNotifyUserOfSuccessfullRegistration
基础结构层将引用应用程序,并将使用SMTP或SMS类实现此接口:

class SmsNotificator : ICanNotifyUserOfSuccessfullRegistration { ... }

稍后,DI容器将把这个实现注入到应用程序中。应用程序将不依赖于基础架构,但仍将使用它,因此依赖于基础架构。即使您使用Java或其他堆栈,我也建议您阅读。

基础结构层是否具有所有层的Ninject配置?如果是的话,我的图层是正确的……循环依赖的需要暗示了其他一些东西,但我知道什么。“我可能帮不了你。”丹尼斯。精确地这也是我们在项目结构方面的进展。不过这里有一个问题。对不起,这不是老年退休金问题的答案。但是应用程序和域之间的区别是什么呢。我的猜测是,域是您拥有域实体的地方,应用程序是您在域实体上应用业务逻辑和规则的地方?应用程序层使用基础设施服务,对吗?基础设施服务在基础设施层吗?是的,但“使用”并不意味着“依赖/引用”。看看我的答案。应用程序使用基础设施而不依赖于it-DependecyInversionPrinciple。是的,我使用DI,但我的基础设施服务合同(接口)在基础设施层。请参阅上次更新。基础设施接口应该在应用程序或域中定义(用它们的术语)。好了,现在一切都好了,我不知道基础设施接口可以保留在应用层中。谢谢你,伙计。。。