应用层与领域层的依赖关系

Dependency between Application Layer and Domain Layer

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

域具有 Domain.Contract 的引用。
应用程序具有 Domain.Contract.

的引用

在域项目中我有卡 Class
在 Domain.Contract 项目中我有 ICard 接口 在应用程序项目中,我只想引用 Domain.contract 并且我有创建 Card

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

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

您的工厂应该在您的域项目中实现,并且应该完全 public。

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

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

是的,工厂必须知道接口并实现 class。这就是它的工作……创建接口的具体实现。

参考文献:

  • 申请 > Domain.Contract
  • 应用 > 域
  • 域 > Domain.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);

据我了解,您可以在 'Domain.Contracts' 中定义 IFactory 接口并将其实现留在 'Domain' 中。现在应用层将只知道 'Domain.Contracts' 并且 IFactory 将被注入到 'ApplicationService' 对象中。事实上 'Factory' 不会是静态的 class' 您的代码应该是这样的:

public class AppService
{
    public IFactory Factory { get; set; }
    public AppService(IFactory factory)
    {
       Factory = factory;
    }
    public void Handle(CreateCommand cmd)
    {
        var card = Factory.Create(cmd.Prop1);
        repo.Add(card);
    }
}