5

在我的大多數項目中,我使用nHibernate + Fluent映射,最近我開始使用Dapper來查看是否可以將讀操作移動到它。使用Dapper映射域實體的私有屬性dot網

我遵循DDD方法,所以我的域實體沒有任何公共setter。例如:

public class User 
{ 
    private int _id; 
    private string _name; 
    private IList<Car> _carList; 

    protected User(){} // Fluent Mapping 

    public User(string id, string name) 
    { 
     // validation 
     // ... 
     _id = id; 
     _name = name; 
    } 

    public int Id{ get {return _id;} } 
    public string Name { get {return _name;} } 
    public IList<Car> CarList { get {return _carList;}}   
} 

public class Car 
{ 
    private int _id; 
    private string _brand; 

    protected Car(){} // Fluent Mapping 

    public Car(string id, string brand) 
    { 
     // validation 
     // ... 
     _id = id; 
     _brand= brand; 
    } 

    public int Id{ get {return _id;} } 
    public string Brand { get {return _brand;} } 
} 

用流利的NHibernate的,我能揭示成員映射:

Id(Reveal.Member<User>("_id")).Column("id"); 
Map(Reveal.Member<User>("_name")).Column("name"); 

有沒有辦法來映射我的域實體小巧玲瓏的?如果是這樣,怎麼樣?

+4

請注意,由User類公開的IList 是一種DDD異味,就像一個setter:你應該公開IEnumerable ,因爲[aggregate]的所有操作(http://dddcommunity.org/library/ vernon_2011 /)狀態應該通過發送給它的[commands](http://epic.tesio.it/doc/manual/command_query_separation.html)來處理。 – 2013-03-08 22:30:19

回答

8

一種選擇是創建一組單獨的持久化類來與Dapper一起工作;例如:UserRecord和CarRecord。記錄類將與db表相匹配,並將被封裝在持久性模塊中。 Dapper查詢將針對這些類運行,然後您可以擁有一個獨立的持久性工廠,它將組裝域實體並將其返回給客戶端。

小例如:

 var carRecord = DbConnection.Query<CarRecord>("select * from cars where id = @id", new {id = 1}); 
     var carEntity = CarFactory.Build(carRecord); 

這創建了一個很好的分離,並提供靈活性。

+3

+1我可以確認此解決方案對於[定製存儲庫]非常適用(http://epic.tesio.it/doc/manual/repositories.html#about_custom_repositories)。 – 2013-03-08 22:34:55

+0

我想過這個解決方案,但是因爲這讓我寫了更多的代碼,我想知道是否有其他選擇。感謝您的意見。 – 2013-03-12 13:46:33

+0

@ R2D2:我想知道,你是如何實現的?我知道這是一個相當古老的帖子,但我陷入了類似的情況,並在搜索時結束了這篇文章。 – 2016-01-06 15:23:50