Domain driven design 是GetById、GetByX CRUD还是业务逻辑方法,或者两者都是

Domain driven design 是GetById、GetByX CRUD还是业务逻辑方法,或者两者都是,domain-driven-design,repository-pattern,ddd-repositories,repository-design,Domain Driven Design,Repository Pattern,Ddd Repositories,Repository Design,我的同事告诉我——我们没有业务逻辑,我们只有像GetById、GetBySearchTerm、GetByParentID这样的CRUD……所以我开始对这些词感到疑惑 在阅读了DDD之后,这些方法都是CRUD,它们有一种基于特定代码(通常是SQL)获取数据的机制(还包括存储、更新、删除…) 如果业务分析师告诉我:“我们需要显示有关特定客户的数据”。 在我看来,这是(GetById)一个业务流程,GetById应该放在应用程序的业务逻辑部分中,它会联系存储库以获取数据。使用CRUD方法的存储库负责根

我的同事告诉我——我们没有业务逻辑,我们只有像GetById、GetBySearchTerm、GetByParentID这样的CRUD……所以我开始对这些词感到疑惑

在阅读了DDD之后,这些方法都是CRUD,它们有一种基于特定代码(通常是SQL)获取数据的机制(还包括存储、更新、删除…)

如果业务分析师告诉我:“我们需要显示有关特定客户的数据”。 在我看来,这是(GetById)一个业务流程,GetById应该放在应用程序的业务逻辑部分中,它会联系存储库以获取数据。使用CRUD方法的存储库负责根据某些标准持久化数据


我知道这个问题可能会导致关于使用原子方法(GetById、GetBySearchTerm、GetByParentiId…)创建存储库的争论但我的问题很简单——这些方法是CRUD方法还是业务逻辑方法。

简单的回答是,除了作为写入/事务一部分的域操作之外,您不应该出于任何原因查询域模型。这方面的事情更感兴趣的是在您的域中发布的命令,以便执行操作

与显示数据相关的任何内容都应该来自尽可能简单的查询/读取模型


如果您发现您的查询需要域交互,您可能会遇到这样的情况:您可能需要告诉您的域执行某些操作,一旦完成,您可以通过查询端请求数据。

并非每个应用程序都是DDD应用程序。有些应用程序只是简单的积垢

业务逻辑将是应用程序的一部分,您可以在其中验证输入(比如get by id,id是一个介于1和99999之间的数字)。然后将其传递到存储库以进行实际查询


但是,如果您的应用程序实际上是一个crud应用程序,那么尝试应用DDD对您没有任何帮助。

这些方法根本不是业务方法。作为CQRS从业者,我建议您在命令端和查询端使用不同的模型。可能是您创建了一个不同的有界上下文,用于整个读取(查询)过程(您可以在此处创建贫血/DTO),以及另一个用于纯业务逻辑目的的域模型

你可以看看我的博客,了解命令和查询的分离


当应用程序查询数据时,它也是一个事务处理过程。我想,我没有理解你。您可以详细说明或简化您的答案。通常,当您查询数据时,它不是事务性的。使用事务进行选择没有太大意义。在任何情况下,我指的是命令/写入端(OLTP)意义上的事务性,而不是读取数据(与OLAP的关系更密切)。