DDD:持久性实体更新逻辑在哪里?

时间:2017-03-28 08:26:20

标签: domain-driven-design

我有两个域实体:

class Foo {
   int Id {get;}
   string Name {get;}
}
class FooBar : Foo {
   RuleEnum Rule {get;}   
   string NewName {get;}
   int OrderId {get;}
}

为他们提供单一持久性模型:

class FooInDb {
   int Id {get;set;}
   int Rule {get;set;}
   string Name {get;set;}
   string NewName {get;set;}
   int? OrderId {get;set;}
}

我有应用服务,将api绑定模型转换为域模型(从IEnumarable<Api.Foo>IEnumarable<FooBar>)。某些业务规则的验证发生在FooBar ctor中。接下来我需要的是:从db加载所有FooInDb并根据以下内容更新其字段:

void Update(FooBar fooBar, FooInDb fooInDb)
{
   fooInDb.Rule = fooBar.Rule;

   if (fooBar.Rule == RuleEnum.New){
     fooInDb.NewName = fooBar.NewName;
     fooInDb.OrderId = null;
   }
   else {
     fooInDb.NewName = null;
     fooInDb.OrderId = fooBar.OrderId;
   }
}

这个决定应该放在某个域名服务中吗? (我个人不希望域服务项目引用持久性模型项目。)如果没有,将它放在存储库并从应用程序服务调用会有多好?

1 个答案:

答案 0 :(得分:0)

您的域名模型似乎非常注重CRUD,但这是另一个故事。

持久层不应该对模型的状态做出决定。如果状态应该根据Rule进行更改,那么模型有责任反映出来。

持久层应该知道的唯一事情是如何通过将模型状态映射到持久性模型来持久保存同一类实体的各种表示。

E.g。其中persistenceFramework被假定为处理持久性模型持久性的任何东西。也不是说我不是C#程序员。

    public void Save(Foo foo) {
        FooInDb dbFoo = persistenceFramework.FindById(foo.Id);

        Map(dbFoo, foo as dynamic);

        persistenceFramework.Save(dbFoo);
    }

   private void Map(FooInDb dbFoo, Foo foo) {
       //Foo mapping logic
   }

   private void Map(FooInDb dbFoo, FooBar foo) {
       //FooBar mapping logic
   }