DDD和Repository模式将有关CRUD的行为放在何处

本文关键字:在何处 CRUD Repository 模式 DDD | 更新日期: 2023-09-27 18:27:11

我试图在我的域模型中放入尽可能多的业务逻辑。

每次MyEntity更新时,我都希望发生两件事:

  1. 向创建消息的用户发送消息
  2. 检查更改是否适用于某些业务规则

如果实体不是聚合根的子级。

通常,我会从存储库中获取特定的实体。更改实体并将其持久化
使用MyRepository.Save()返回数据库

在这种情况下,我必须将业务逻辑放在我的应用程序或DAL中,而不是域模型中。除非绝对必要,否则我会尽量避免使用业务逻辑层,但除非我制作了一个名为MyEntity.Update()的方法或类似的方法,否则我似乎无法适应这一点,但我觉得这不是正确的方法。

DDD和Repository模式将有关CRUD的行为放在何处

首先让我声明,我不反对Repository模式。我最近在一个项目中成功地使用了一个。

我想说的是要小心。。。如果不能在对象中封装需求,那么可能需要重新考虑OO方法。为了做其他事情而引入数据访问层似乎是一种代码味道。我使用了服务层来接收请求、管理事务和版本控制,但不用于验证等其他事情。您的服务层可能如下所示。

    public enum UpdateResult
    {
         Success,
         NoMyEntityFound,
         StaleData,
         InvalidRequest
    }

public class MyService
{

     ...
     ...

     public UpdateResult Update(...)
     {
          ...Start Tran
          ...Load var m = MyEntity
          ...do the bare minimum here 
          ...m.Update()
          ...Commit Tran
          return UpdateResult.Success;
     }
}

说了这么多关于存储库的警示尾巴

http://ayende.com/blog/3955/repository-is-the-new-singleton