2

我目前正在构建一个 CQS 风格的 DDD 应用程序。我对所有“组件”如何相互工作有一些疑问。

但首先我将简要概述一下应用程序的结构:

ApplicationService 
  -> Receives command objects 
  -> doesn't return any results
  -> Acts on Domain model
  -> Speaks with Aggregate repository for domain modifications

QueryService
  -> Bypasses domain model; doesn't speak with Aggregate Repositories
  -> Executes queries against database to populate view
  -> Returns 'Representation' objects

REST Controller
  -> Receives HTTP requests and binds 'body content' & request params to Command objects
  -> delegates to ApplicationService for POST, PUT & DELETE requests
  -> Always returns at least some HTTP code
  -> delegates to QueryService for GET requests

Infrastructure
 -> Handles persistence to DB
 -> Contains some scheduling operations
 -> Handles foreign domain events our domain model is 'interested' in

'Open Host'
  -> This is mainly a Facade to be used by other domains
  -> Facade delegates methods to ApplicationService for domain modifications and to QueryService for data retrieval (bypassing Repositories)


我的问题:

  1. a 与aDomainEventHandler对应并在 aRepository上调​​用某些方法可以Aggregate吗?或者它应该总是对应于一个ApplicationService
  2. QueryService返回 'Representation​​ ' 对象。这些由 UI AND by'Open Host' Facade作为返回值使用。可以将这些对象重用为返回值Facade吗?还是应该Facade自己创建Objects,连结果都基本一样?
  3. ApplicationService将 ' Commands' 作为输入参数。可以吗?这些Commands也被使用Open Host Facade?还是应该Facade只接受原始值并Commands在委托给时将它们转换为ApplicationService
  4. DomainEventHandlers似乎驻留在“ Infrastructure”层。是否有可能 aApplicationServiceDomain Service也订阅了 a Domain Event?或者这总是一种Infrastructure责任?

非常欢迎所有建议!

4

1 回答 1

2

DomainEventHandler 与 Repository 对应并在 Aggregate 上调用某些方法是否可以?还是应该始终与 ApplicationService 对应?

根据我的经验,任何处理程序都是应用程序服务。

QueryService 返回“表示”对象。这些被 UI 和“开放主机”外观用作返回值。这些对象是否可以被 Facade 重用为返回值?还是应该 Facade 自己创建 Objects,连结果都基本一样?

这里很多关于 Open Host 服务和 Application Service 之间的区别的讨论。我不清楚谁会使用 Open Host 服务,或者它为什么存在。

ApplicationService 将“命令”作为输入参数。这些命令是否也被 Open Host Facade 使用?或者当委托给 ApplicationService 时,Facade 是否应该只接受原始值并将它们转换为命令?

我会在应用程序的边缘传递原语并将它们转换为命令,然后在应用程序服务中处理

DomainEventHandlers 似乎驻留在“基础设施”层。ApplicationService 或 Domain Service 是否也可能订阅 Domain Event?或者这始终是基础设施的责任?

我一直认为我的处理程序是应用程序服务——负责编排用户案例的东西。所以用例可能是“当收到 EventX 时,发送电子邮件并更新数据库”。在此示例中,您可能会认为“发送电子邮件的代码”和“保存到数据库的代码”是基础架构问题,但处理程序本身不会。

public class ExampleHandler : IHandle<ExampleEvent> 
{
    private IRepository _repo;
    private ISendEmails _emailer;

    public ExampleHandler(Repository repo, ISendEmails emailer)
    { 
        .... set the private fields..
    } 

    public void When(ExampleEvent event) 
    {
        _emailer.Send(event.whatever);
        _repo.Save(something);
    }
}

老实说,我并没有真正考虑层次——我更喜欢六边形架构的思维方式。在上面的示例中,事件处理程序只需将依赖项注入其中,然后继续他们的业务。

于 2016-07-28T20:49:55.070 回答