Domain driven design NLayered DDD(域驱动设计)中各层如何相互对话

Domain driven design NLayered DDD(域驱动设计)中各层如何相互对话,domain-driven-design,Domain Driven Design,我们正在努力使DDD适应我们的新项目。 我们正在使用Microsoft DDD Nlayer作为示例项目。 这更多的是DDD问题,而不是Microsoft Nlayer DDD。 我知道在DDD中,您应该只从应用程序层调用数据层,而不从域层调用数据层。但是在文档中,它还说您仍然可以从域层调用数据层(仍然说避免它)。我该怎么做?当我在VisualStudio中尝试从域层添加数据层引用时,它会说“将此项目添加为引用将导致循环依赖。”。 我知道我们可以在应用层获取数据,然后将其传递到域层,但这并不总是

我们正在努力使DDD适应我们的新项目。 我们正在使用Microsoft DDD Nlayer作为示例项目。 这更多的是DDD问题,而不是Microsoft Nlayer DDD。 我知道在DDD中,您应该只从应用程序层调用数据层,而不从域层调用数据层。但是在文档中,它还说您仍然可以从域层调用数据层(仍然说避免它)。我该怎么做?当我在VisualStudio中尝试从域层添加数据层引用时,它会说“将此项目添加为引用将导致循环依赖。”。 我知道我们可以在应用层获取数据,然后将其传递到域层,但这并不总是我需要基于逻辑获取数据的情况。 如果我不能访问数据,我在域层可以有什么逻辑?大多数时间逻辑将基于另一个类及其数据(在同一个域或不同域中)。 请引导我。这是我的无知,因为我不知道层之间应该如何通信。

这不是软件(至少是OLTP类型)的工作方式。想想一个用例,想想所涉及的对象。提前查询所有数据。使用数据实例化对象。让对象协作以执行用例。保存已更改对象的数据

下面是一个例子:

public class IncludePhotoInPortfolioHandler {
  public void Handle(IncludePhotoInPortfolio useCase) {
    var photo = _photoRepo.GetById(useCase.PhotoId);
    var portfolio = _portfolioRepo.GetById(useCase.PortfolioId);
    portfolio.Include(photo);
  }
}
如果您一次更改了太多对象,则说明您做得不对。你会遇到各种棘手的问题。在奇怪的情况下,您需要根据驻留在对象中的标识符获取数据/对象,以某种方式公开这些标识符,并使用它们获取相关对象

提示:您可能希望阅读蓝皮书中关于DDD的内容,而不是将您的头放在这个NLayered DDD项目中。不要把层放在基座上。

这不是软件(至少是OLTP类)的工作方式。想想一个用例,想想所涉及的对象。提前查询所有数据。使用数据实例化对象。让对象协作以执行用例。保存已更改对象的数据

下面是一个例子:

public class IncludePhotoInPortfolioHandler {
  public void Handle(IncludePhotoInPortfolio useCase) {
    var photo = _photoRepo.GetById(useCase.PhotoId);
    var portfolio = _portfolioRepo.GetById(useCase.PortfolioId);
    portfolio.Include(photo);
  }
}
如果您一次更改了太多对象,则说明您做得不对。你会遇到各种棘手的问题。在奇怪的情况下,您需要根据驻留在对象中的标识符获取数据/对象,以某种方式公开这些标识符,并使用它们获取相关对象

提示:您可能希望阅读蓝皮书中关于DDD的内容,而不是将您的头放在这个NLayered DDD项目中。不要把层次放在基座上