2013-02-10 86 views
1

我構建了兩個C#三層應用程序,它們的數據是一個非常舊的數據庫客戶表,它具有大約100列。他們在業務層執行一些邏輯,表示層顯示數據。三層實體框架應用程序中的DTO

客戶表的佈局 -

CustomerID 
Firstname 
Lastname 
DateOfBirth 
Othervalue1 
Othervalue2 
Othervalue3 
. 
. 
Othervalue95 
Creationdate 
Updatedate 

對於這兩個應用程序,我只需要客戶表,但我與實體框架建立一個新的數據訪問層。未來的項目將需要訪問其他表,並將添加到此訪問層。

我將使用工作單元和存儲庫模式。

我的問題如下 -

應用程序A需要客戶表列的一個子集

應用B需要客戶表列的不同子集(有與應用A的需求有一些重疊)

如何執行從數據層到這些t的映射我獨立的業務層?我知道我可以使用automapper執行從數據實體類到業務層類的映射,但是我將擁有兩個不同的業務層Customer類。

我一直在閱讀關於DTO的一些內容,但是我沒有看到這個n層應用程序應該去哪裏。

回答

3

您可以使用基於應用程序的設計
1個任何這些 - 地圖客戶表與兩個或多個實體
2 - 有像CustomerBase和2個以上的子實體基實體。
3 - DTO是數據傳輸對象,它們(通常)是可變的。更改它們不會導致DB上的CRUD操作。
DTO用於如下場景:客戶實體是一個重量級對象(比如說100列),您只需要這些數據的子集(如20列)。 DTO的對象和實際實體之間 轉換可在如自動映射器,手動操作oveloading多許多方式實現......

希望這有助於

+0

我的業務層已經是一個輕量級的Customer。數據層的客戶數量很大,DTO的代碼應該在哪裏生活? – tom 2013-02-10 22:59:34

+0

想想這個。 – 2013-02-11 05:44:24

+0

在演示文稿層中,您有一個演示者(如窗戶窗體,必須顯示有關客戶的詳細信息,其中包含他的姓名和號碼......以及他的CreditScore(其他實體)和他的最後10個訂單),因此您需要DetailedCustomerDTO,填充一些其他實體數據並將其發送到使用界面。 – 2013-02-11 05:53:24

1

繼承人我會做什麼:

在應用程序A中 - 提取您需要的數據,並將它們映射到一個新類(一個DTO) 與應用程序B執行相同操作。

如果兩個應用程序沒有其他關係,那麼應共享數據庫沒有其他的。即:保持應用程序A不存在應用程序B,反之亦然。

DTO只是您在n層應用程序中共享的對象的一個​​奇特名稱。

+0

我應該在哪一層放置DTO?我不認爲它可以進入數據層,這意味着兩個DTO(一個用於應用程序A,另一個用於應用程序B) – tom 2013-02-10 22:55:27

+0

好,這取決於。也許你需要很多DTO的。鑑於你的senario,你可能需要在數據層之間的DTO,而你Bizz-Tier是他們自己的實體。 在你BIZZ層你再映射到一個新的DTO - 由BIZZ層和表現層 – 2013-02-11 07:25:49

1

您可以使用IOC並將相關映射器注入到您的數據層中。

您是否需要使用UoW和存儲庫模式? EF是一個數據訪問抽象,具有自己的工作單元。您可以在業務層訪問DBContext並使用Linq將數據投影到DTO中。

+0

共享如果我添加的DbContext到我的業務層,不會被我針對實現和夫婦的業務和數據層? 就像使用IoC注入映射器的建議一樣。 – tom 2013-02-10 22:50:46

+0

是不是很理想,但我在規範化的關係數據庫上苦苦掙扎,而且經常最終在某處出現IQueryable! IoC解決方案應該適合你。祝你好運。 – iandayman 2013-02-10 23:28:38

1

您需要在舊系統上只讀訪問嗎?

在這種情況下,我建議使用每個應用程序和兩個不同的實體框架模型,你只能映射所需的列的Anti Corruption Layer pattern

如果需要還寫它可能是困難的,你必須映射所有列。

如果你想使用一個單一的實體框架模型,那麼你可以使用DTOS地圖數據的子集。在這種情況下,自動映射器可以是一個好的解決方案。

+0

將閱讀關於反腐敗層。關於DTO的使用 - 他們應該在我的階層居住在哪裏? – tom 2013-02-10 22:52:26

+0

@tom它們是域類,因此它們生活在域圖層中。我通常使用實體定義,dtos,枚舉和存儲庫接口(或其他基本服務接口)創建一個xyz.domain程序集。 – 2013-02-10 23:34:53

+0

如果我把DTO放在領域層,那麼數據層是否會引用領域層呢?如果是這樣,那麼這兩個層不會結合? – tom 2013-02-11 00:07:11