2011-01-28 48 views
1

我想知道在將DTO轉換爲其對象域對象時使用存儲庫是否糟糕。使用存儲庫的對象映射器

我建立具有儲存庫層和ORM服務層和EF4 n層的Web應用程序。服務層公開DTO版本的域對象。當我從服務的使用者接收到DTO時,服務將使用AutoMapper將DTO轉換爲域對象。現在,一些領域對象的成員屬性將需要從數據庫加載,比如我有下面的類 -

DTO版本:

public class LogonEventDto 
{ 
    public DateTime Time 
    { 
     get; 
     set; 
    } 

    public Guid UserId 
    { 
     get; 
     set; 
    } 
} 

域的版本:

public class LogonEvent 
{ 
    public DateTime Time 
    { 
     get; 
     set; 
    } 

    public User User 
    { 
     get; 
     set; 
    } 
} 

現在,當涉及到將DTO轉換爲DO版本時,我需要調用UserRepository的GetById()方法並設置LogonEvent.User屬性h結果。

只是爲了讓你知道,我正在做手工的全部轉換邏輯在服務層。

因此,正如我上面問,這是一個不好的設計決定,如果是的話,爲什麼?

回答

1

我認爲它的常識是這樣做的。您將您的內部狀態表示(域模型)與服務合同(dto/data contracts)分離。這樣你就不會暴露任何內部,你可以重構你的實現而不影響你的公共服務契約(假設映射仍然是可能的)。

我們使用這個模式所有的時間在我們的SOA(-isch)客戶項目。我們甚至有一個工具來幫助您生成映射代碼。

我不是AutoMapper的粉絲(雖然代碼是非常酷的),因爲它需要你在運行時指定映射(你必須編寫代碼來建立映射DEF的)。在我看來,映射定義是一個設計時間的事情。這就是爲什麼我們要構建一個代碼生成器工具。

根據我的經驗,我遇到了以下:

  • 不要取數據(憑身份證),每個記錄分別。而是在一次往返(對數據庫/數據源/其他Web服務)中彙編一個您想要解析的Ids列表,並讓映射只需查找檢索到的批處理。
  • 與大量對象和源和目標之間不同的類層次結構的複雜映射,很難保持你映射了什麼,在哪裏以及如何概述。沒有真正的解決方案 - 除了建立一個工具來幫助你。

希望它能幫助。 Grtx,Marc