【问题标题】:Where should infrastructure services contracts live?基础设施服务合同应该放在哪里?
【发布时间】:2011-11-28 15:23:39
【问题描述】:

我有 UIApplicationDomainInfrastructure 层。

在我的 Infrastructure 层中,引用 DomainApplication 层以使用 Ninject 注册两者的服务接口.

但是我需要在我的 Application 层中的 Infrastructure 层中的服务,然后我需要在我的 中引用 Infrastructure 层应用层

问题是 Infrastructure 层引用了 Application 层,我什么时候会在 Application 中引用 Infrastructure 层> 图层显示如下错误:

无法添加对“基础设施”的引用。将此项目添加为引用会导致循环依赖。

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

【问题讨论】:

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


    【解决方案1】:

    听起来您的图层要么过于紧密耦合,要么边界错误。您可以通过引入存在于他们自己的项目中并且可以被其他人引用的接口来解耦这些层。

    【讨论】:

    • 基础设施层的所有层都有 Ninject 配置?如果是,我的图层是正确的......
    • 对循环依赖的需求暗示了别的东西,但我知道什么。我可能帮不了你。
    • @Dennis 。正是……这就是我们如何推进我们的项目结构的方式。这里有一个问题。抱歉,它对 OPs 问题的回答并不多。但是应用程序和域之间有什么区别。我的猜测是域是您拥有域实体的地方,而应用程序是您在域实体上应用业务逻辑和规则的地方?
    【解决方案2】:

    基础设施服务合同应在使用它们的层(域和应用程序)中定义,但在基础设施中实施。看看Dependency Inversion PrincipleOnion Architecture。基础设施层应该依赖于 App 和 Domain。您的域和应用程序不应依赖于基础架构。它们应该依赖于以它们自己的术语定义的抽象。你可能会觉得这个answer 很有趣。这个抽象的实际实现应该在应用程序启动时注入所谓的Composition Root

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

    ICanNotifyUserOfSuccessfullRegistration
    

    基础设施层将引用应用程序并将使用 SMTP 或 SMS 类实现此接口:

    class SmsNotificator : ICanNotifyUserOfSuccessfullRegistration { ... }
    

    稍后此实现将通过 DI 容器注入到应用程序中。应用程序不会依赖于 Infrastructure 但仍会使用它,因此 Dependecny Inversion。我建议阅读Dependency Injection in .NET,即使您使用 Java 或其他堆栈。

    【讨论】:

    • 应用层使用基础设施服务,对吧?基础设施服务在基础设施层?
    • 是的,但“使用”并不意味着“依赖/引用”。看我的回答。应用程序使用基础设施而不依赖它 - DependecyInversionPrinciple。
    • 是的,我使用 DI,但我的基础设施服务合同(接口)位于基础设施层。
    • 查看上次更新。基础设施接口应在 App 或 Domain(按照它们的术语)中定义。
    • hooo,现在一切都好,我不知道基础设施接口可以保留在应用层中。谢谢大佬...
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2010-10-16
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多