1

我首先想說我是而不是試圖完成我目前設計中的領域模型。這是「貧血」模型可接受的設計嗎?

話雖這麼說,我目前正在建設一個類似如下的架構:

UI DTO <=> Service DTO <=> Business/Database DTO (using AutoMapper) 

我一直在閱讀Eric Evan's DDD book,並還觀看Greg Young's 7 reasons why DDD projects fail,生怕貧血模型。即使我沒有開DDD,我也不想創建太多的圖層,所以不斷繪製非常類似的東西是很麻煩的。

但是,我所做的設置的全部原因是雙重的。變化和模糊

  • 易於改變的簡單:如果我的公開對象通過我的服務暴露出來,我在內部使用的UI和業務對象的話,我更自由地作出不打破現有的API的變化。但是,如果DTO開始偏離,也許我可以使用一個DTO並重構?
  • Obscurity:我可以公開我的公共對象,但不公開我的完整對象及其實現,如果它們是內部的。這將需要一個安全的產品,所以我正在爲此做準備。但是,也許我以後可以重構那個?

所以,我的問題是這樣的:我目前的模型是否有意義,或者我稍後要求問題?沒關係,因爲這些對象主要是DTO的?即使在埃文的書中,他暗示說,如果計劃分佈在不同的服務器上,這種模式是可以的。那麼,我的分層是否僅僅是因爲這個原因,因爲我打算讓UI,服務和數據庫層能夠位於不同的服務器上(他們目前沒有當前需要)?

我只是想知道過度體系結構,但在同一時間試圖避免體系結構.....所以,這是模型結構對我目前的實施有利還是不好?

回答

2

這是我的團隊使用ASP.NET MVC和WCF開發的模式,其中您的業務/數據庫dto映射到實體框架類,您的服務映射到傳入/傳出的POCO類/ DataContract WCF服務和您的UI dto映射到MVC模型。

雖然這可能看起來多餘,但很少每層的需求都適合於一個設計,其中堆棧中的所有三個dto具有相同的屬性。他們傾向於不同的一個例子是在查找表的外鍵中。在數據庫層中,這將由一個int表示,而在服務層中,這將更好地建模爲一個枚舉,從而強化類型安全性,最後,在UI中,所述字段將被轉換爲本地字符串顯示給用戶。

關於你對過度設計的恐懼,有些事情可以說簡單。推動我使用這種模式的力量在於,我需要獨立於我的用戶界面來部署我的應用程序層,或者僅僅是我與擁有兩名以上開發人員的團隊一起工作。隨着團隊的成長,團隊成員決定繞過業務層並直接面對數據庫的可能性會大大增加。在這樣做的時候,它們總是會破壞你所使用的任何面向方面編程的目的 - 即,東西不會被記錄或包裹在交易中。添加額外的圖層並將其移動到單獨的服務器上會創建一個清晰的關注點分離,更重要的是,可以強制執行它。一個或兩個人的團隊可能會受到足夠的紀律以避免這種情況發生,但隨着您的成長,它變得非常快速。

希望有幫助!

0

我首先想說的是,我並不是試圖完成一個域模型

...

,生怕貧血模型

這些的2對我來說似乎有點矛盾。

即使我沒有處方到DDD,我不想創建,它成爲一個痛苦,以保持映射非常類似的事情 來回太 多種層次。

貧血或富域模型的概念作爲建議在DDD不承擔對你有層數,由這些層所使用的數據結構,以及如何任何這些數據結構轉換和從圍繞着通過層到另一層。

豐富的域模型僅意味着您的業務層包含的域對象除數據外還封裝了行爲。你可以完美地擁有一個豐富的內部域模型,並且只將公共服務作爲他們行爲的外觀,並且如果你想要的話,下面有十億個圖層,每個圖層都操縱它自己的DTO。

所以,我的問題是這樣的:我現在的模型是否有意義,或者我以後要問什麼問題? [...]我只是想知道過建築,但在同一時間 試圖避免在架構..

您的模型看起來並不像所有過度architectured。它只反映分層應用程序中的自然圖層。就像Doug說的那樣,DTO的每一層都有點不同,這是很正常的,因爲它們不能達到同樣的目的。

+0

但是,在我目前的情況下,它們在每一層都是一樣的,所以爲了「以防萬一」,爲什麼它目前似乎過分地將對象串起來了, –