CQRS和ES Design查询

时间:2015-11-22 20:45:53

标签: c# wcf cqrs

这更像是一个设计问题,如果这是错误的地方,请道歉。也就是说,我正在设计一个应用程序,它包含一个带有WCF服务层的WPF用户界面,该服务层提供对应用程序数据和业务逻辑的访问。我有几个需要CQRS和ES的场景,这是我的问题来源。

CQRS是关于命令和查询分离的,所以我的问题是我的WCF服务也应该分开,所以我在一个服务中使用Command方法,在另一个服务中使用Query方法。例如:

public class PatientCommandService
{
    public void AddPatient(AddPatientDto patient) { }
}

public class PatientQueryService
{
    public PatientDto GetById(int id) { }
}

我是CQRS和ES的新手,并且一直努力在互联网上找到可以回答这个问题的任何有形内容,尤其是围绕WCF和WebAPI等Web服务。

在同一服务中使用所有服务方法并在每个服务方法的实现中通过存储库层分离命令和查询似乎是明智的。但这似乎无视CQRS的分离部分,我也与单一责任的SOLID原则相冲突。

有没有人在WCF服务背后实施CQRS并处理了这种情况,我正在寻求一些关于实施CQRS的最佳方法的建议。

1 个答案:

答案 0 :(得分:2)

CQRS不是关于命令/查询分离,而是关于责任隔离。使用CQRS,您的数据库不再是ACID,它更像是最终的一致性方法。

原因是读/写代码是分开的,这也意味着必须使用写模型中的事件填充读模型。

Your write transaction -> change event is published -> read model updates it's data

我强烈建议您在使用UI时转向基于任务的方法。命令应该包装业务事务而不是数据库操作。我的意思是命令通常涉及多个根聚合。

如果这对你不起作用,只需使用审计表,而不是引入CQRS带来的所有复杂性。