首页 > 解决方案 > 应用层和领域层之间的依赖关系

问题描述

我想减少ApplicationLayer和DomainLayer之间的联系。考虑一下我在域项目中创建了一个 AggregateRoot。如果我直接从应用程序引用域就可以了。
但是我想使用接口而不是实现,所以我创建了Domain.Contract来保留Domain项目的接口和合同!Domain对这个项目有一个参考来实现接口。如何在应用层使用这个合约。换句话说:

Domain 有 Domain.Contract 的引用。
Application 有 Domain.Contract 的引用。

在域项目中,我
在 Domain.Contract 项目中有 Card 类在应用程序项目中有 ICard 接口我只想引用 Domain.contract,并且我有创建 Card 的 CommandHandlers 方法

CommandHandlerMethod()
{
   var card = ICard?!!! //What should I do here?
   repository.Save(card);
}

我发现的一种方法是使用工厂。但是工厂现在应该是接口和实现的类,它们在不同的项目中。如果我在 Domain.contract 项目中使用工厂,它将导致引用循环。如果我在域项目中使用工厂,应用程序项目将如何使用它?!

标签: dependency-injectiondependenciesdomain-driven-design

解决方案


你的工厂应该在你的域项目中实现并且应该是完全公开的。

它的目的是为应用层构建一个ICard,而不需要应用层直接与Card交互。如果部署在与工厂相同的项目中,则 Card 上的构造函数可以是内部的。

工厂不应在合同中。合约应该只包含接口,而不是任何实现,包括工厂。

是的,工厂必须知道接口和实现的类。这就是它的工作……创建一个接口的具体实现。

参考:

  • 应用程序 > 域.Contract
  • 应用 > 领域
  • 域 > 域.合同

域名合约

public interface ICard
{
    public string Value { get; }
    public void SetValue(string value);
}

领域

public class Card : ICard
{
    string Value { get; private set; }

    public void SetValue(string value)
    {
        Value = value;
    }

    // INTERNAL.  Can only be created by the factory, not the application
    internal Card(string value)
    {
        SetValue(value);
    }
}

public static class CardFactory
{
    public static ICard CreateCard(string value)
    {
        return new Card(value);
    }
}

应用

ICard card = CardFactory.CreateCard("Ace of Spades");
repo.Add(card);

推荐阅读