2017-03-28 87 views
1

我有兩個域實體:DDD:持久性實體更新邏輯在哪裏?

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。我需要什麼未來:從數據庫加載所有FooInDb S和更新其領域,根據:

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; 
    } 
} 

如果這一決定被放置在某一領域的業務? (我個人不希望域服務項目中引用的持久化模型的項目。)如果沒有,怎麼罰款,可以將其放置在倉庫和應用服務打電話?

+0

正如你所說,域項目不應該引用持久性項目,因爲它不應該關心技術持久性細節。因此,將域模型和數據庫之間的映射放入持久性項目中。 –

+0

我動一下一下地映射到工廠方法決定'FooBar':'FooBar.New()'和'FooBar.NotNew()' – smg

+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 
    } 
+0

如果存儲庫模式是內在簡單的更新操作中使用2個DB查找是否正常?首先進行模型創建,然後再提交模型進行更新? – Tenek

+1

@Tenek那麼,第一次查找顯然是需要的,但第二次查找可能不會。例如,一些ORM在內存中保存一個身份映射,以便執行髒檢查,而不是對數據庫執行它以瞭解需要更改的持久性。 – plalx

+0

是有道理的,我們dumm傳統DAL第二查找將是必要的:(這DAL甚至不具有會話/事務管理器... – Tenek