2009-11-23 94 views
1

我有三個層一個asp.net MVC應用程序: - 與實體和儲存庫(NHibernate的)圖案 數據層 - 與服務(功能)服務層,它與數據層通信。 - 用asp.net mvc應用程序的ui層,它與服務層進行通信。缺少我的應用程序的一部分/層

問題是我的實體中的數據與我的視圖中的數據不同。 所以我使用自定義形狀的ViewModels。但我不喜歡我在服務層和視圖模型之間進行映射的方式。 一切都在控制器動作中發生。我使用AutoMapper,但我認爲意大利麪代碼太多。 讓我舉個例子:

1.)我有一個用戶註冊過程。我有一個名字,姓氏,電子郵件,OpenId輸入映射到ViewModel中相同的 屬性。但是,比起我需要不同的實體來存儲這些數據(一個用於用戶,另一個用於openid身份 - 用戶可以具有多個openid身份)。 所以在我的控制器操作中,我有一個視圖模型和用戶實體之間的映射(AutoMapper)和視圖模型和openid實體之間的映射(AutoMapper)。在那之後,我用服務功能保存每個實體 。

我錯過了一些東西 - 比如自定義的DTO(我認爲viewmodel應該在服務層和web層之間共享),它將在web和服務層之間傳遞。

2.)我在應用程序中有搜索功能。從控制器操作中,我調用服務層,它返回與搜索條件匹配的文檔實體列表。 但問題是我也想顯示每個結果的類別(不同的實體)。因此,在控制器操作中,我在結果之間循環,並在視圖模型中將類別信息 添加到IDictionary結構中。

我也想念這裏的東西 - 又一些DTO,它將返回對(新對象)列表:文檔,類別。

DTO是否是正確的模式?我應該看看DDD嗎?任何相關的材料將不勝感激。

非常感謝!

回答

0

我不認爲您在應用程序架構中缺少一層,但聽起來您缺少某些類型(類)。

您是否應該創建更多的DTO?不,我不認爲這是一個好主意。 IIRC,DTO的原始定義是跨越流程邊界傳輸數據。 WCF數據合同是DTO的一個很好的例子。但是,由於DTO僅僅是消息,它們不包含任何行爲。如果你在DTO中建立內部API,它將導致Anemic Domain model

您應該認真考慮在您的應用程序中添加新類型以捕捉您的需求。這種類型應該去哪裏?

這取決於。如果可以說所討論的類型封裝了一個通用的概念,它就屬於域模型。如果只支持給定的(用戶)接口,它就屬於該層。

在你的第二個例子中,你需要結合Document和Category,儘管它們是獨立的實體。這種組合是否包含一個反覆出現的概念?如果是這樣,它就屬於你的域模型。如果不是,它就屬於你的UI層。

如果有疑問,請將新類型放置在外層(您的UI層)。如果事實證明這是一個比您最初想象的更普遍的概念,您可以相對輕鬆地將其移動到您的領域模型。移動另一種方式更難,因爲這種類型可能已經污染了域模型,所以從外層開始是最安全的選擇。

+0

謝謝你的回答。我會考慮添加新的類型而不是DTO(儘管我需要一些DTO用於我的Silverlight客戶端的wcf服務 - 但這是另一個故事)。 – rrejc 2009-11-24 21:25:57