【问题标题】:The placement of utility classes in DDDDDD 中实用程序类的放置
【发布时间】:2015-04-01 12:09:46
【问题描述】:

我正试图找出将我的实用程序类放在基于 DDD 的项目中的位置。案例如下:

我有一个名为 CookieAwareWebClient 的类,它是核心工作所必需的。从我在网上阅读的内容来看,这似乎是属于基础设施层的一个类,但是不应该从核心层引用基础设施层。这意味着我不能将核心层所依赖的功能放置在基础设施层中。那么这个 CookieAwareWebClient 类应该放在哪里呢?

【问题讨论】:

  • 这个名字听起来显然是基础设施的一部分。如果不进一步了解您的代码和应用程​​序,我会说当您的核心依赖于此类时,您遇到了设计问题。
  • @Jehof 对此类的依赖源于核心层中的服务类,该服务类从 API 检索数据并将所述数据返回给调用应用程序。我认为在这种情况下,存储库只会过多。你怎么看?
  • 所以 CookieAwareWebClient 用于调用您的核心所依赖的外部服务。对吗?
  • 没错。它用于连接到 API 并从所述 API 返回数据。我核心中的服务基本上是这个 API 的包装器。
  • 你的领域模型和这个服务有什么关系?通常,您会在域模型中声明一个接口并在基础设施层中实现它,就像使用存储库模式(即依赖倒置原则)一样。此类服务通常由应用程序服务使用,而不是由域使用。例如,很少从实体中使用存储库。如果可以,让应用程序层解决依赖关系,但如果这不切实际,您总是可以在方法级别将服务注入实体。使用接口隔离会有所帮助。

标签: domain-driven-design


【解决方案1】:

在不确切了解您需要做什么的情况下,我相信@plalx 在 cmets 中总结了它:

  • 建立一个接口,提供您的核心层所需的功能
  • 在CookieAwareWebClient中实现这个接口
  • 使用依赖倒置来允许核心使用 CookieAwareWebClient

下面是一些代码(在本例中为 C#),以构造函数注入为例:

界面:

namespace Core
{
  public interface IBlah
  {
    int SomethingCoreNeeds();
  }
}

CookieAwareWebClient的实现:

namespace Services
{
  public class CookieAwareWebClient : IBlah
  {
    // ... rest of class 
    private int _somethingCookieAwareWebClientHasThatCoreNeeds;

    public int SomethingCoreNeeds()
    {
      return _somethingCookieAwareWebClientHasThatCoreNeeds;
    }
    // ... rest of class 
  }
}

Core 中的消费服务:

namespace Core
{
  public class DomainService
  {
    private readonly IBlah _blah;

    public DomainService(IBlah blah)
    {
      _blah = blah;
    }

    public void DoSomething(DomainEntity entity)
    {
      entity.NeededValue = _blah.SomethingCoreNeeds();
    }
  }
}

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 2011-10-05
    • 2017-01-29
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2011-10-16
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多