DDD和Repository模式放置有关CRUD的行为

时间:2012-03-09 14:19:30

标签: c# repository domain-driven-design persistence

我尝试在我的域模型中尽可能多地使用业务逻辑。

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

  1. 向创建该消息的用户发送消息
  2. 检查更改是否适用于某些业务规则
  3. 如果实体不是聚合根的子节点。

      

    通常我会从存储库中获取特定实体。更改实体,并坚持下去   使用MyRepository.Save()

    返回数据库

    在这种情况下,我必须将业务逻辑放在我的应用程序或DAL中,而不是域模型中。我试图避免使用业务逻辑层,除非绝对必要,但我似乎无法适应这个,除非我创建一个名为MyEntity.Update()的方法或类似的东西,但我有一种不正确的感觉这样做的方式。

1 个答案:

答案 0 :(得分:1)

首先让我说,我不反对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