2012-01-16 92 views
7

我正在爲ASP.NET MVC應用程序中的每個屏幕創建查看模型。我將所有創建視圖模型的邏輯放在構建器類中。通常,將數據對象轉換爲視圖模型有特殊的邏輯,包括聚合,過濾和排序。每個構建器都會通過一個依賴項集合,這是一個包含每個依賴項(存儲庫,其他構建器等)屬性的對象。有關查看模型避免長名稱的命名約定

問題是我的名字變得確實是長。一個依賴集通常都會有一個名稱組成是這樣的:

視圖模型名+生成器+ DependencySet

查看模型通常有你在哪裏現在,孩子們組成的名字。例如,我的系統已經對提供者定義進行了分類。因此,爲了顯示下一個類別供應商的定義,我有一個稱爲視圖模型:

CategoryProviderDefinitionListViewModel

它會是這個樣子:

public sealed class CategoryProviderDefinitionListViewModel 
{ 
    public long CategoryId { get; set; } 
    public string CategoryName { get; set; } 
    public ProviderDefinitionViewModel[] ProviderDefinitions { get; set; } 
} 

所以,我建設者被稱爲

CategoryProviderDefinitionListViewModelBuilder

所以,我的依賴集稱爲

CategoryProviderDefinitionListViewModelBuilderDependencySet

勉強在屏幕上適合。我可憐的手指很累。此外,一些屏幕幾乎顯示相同的數據,因此他們的視圖模型名稱幾乎相同。當我瀏覽我的文件夾時,很難找到我正在尋找的特定視圖模型類。

理想情況下,我可以將我的視圖模型類組合在一起,將它們與它們所在的視圖相關聯。儘量避免碰撞並儘可能縮短名稱,同時保持意義。有沒有人發現一個命名約定/文件夾組織在這種情況下運行良好?

回答

8

我一直在使用「ViewModel」後綴一直持續很長一段時間,說實話,有時我覺得它是多餘的。我認爲只需將所有這些類分組到不同的名稱空間就足夠了。

我的理解是,這個慣例已經被採納,以避免域模型和視圖模型類之間的碰撞(例如產品 VS ProductViewModel)。但是,由於您的視圖模型是以屏幕命名的,所以您的域模型中的同一個名稱不太可能具有相同的名稱。事實上,爲什麼你的域模型中有這樣的類呢?:)

所以,如果你的名字你的視圖模型類似ViewProduct(允許用戶查看/編輯產品),你不需要調用它ViewProductViewModel。看看我要去哪裏?

因此,您的生成器類可以簡單地稱爲ViewProductBuilder而不是ViewProductViewModelBuilder

關於你的依賴集,我不知道你背後的理由是什麼。但對我來說這看起來沒有必要。如果構建器對其他對象有依賴關係,則需要在構建器的構造器中注入依賴關係,而不是將它們封裝到另一個類(DependencySet)中,然後將它們傳遞給它們。

如果你發現你的構建器依賴於可能的東西,這就是你想要隱藏在DependencySet後面的東西,那麼它可能是其他地方設計氣味的指示。如果類和它們的依賴關係是以適當的面向對象的方式設計的,那麼行爲應該在各個類之間很好地分配,並且任何類都不應該依賴太多的其他事物。因此,將這些N依賴關係隱藏在1個類(DependencySet)下僅僅是治療症狀而不是問題本身。

希望這有助於:)

3

我喜歡定影后我的視圖模型名稱以 「DTO」。 (其中DTO代表數據傳輸對象,即除了含有信息之外什麼也不做的對象)

這不僅是爲了避免長名稱。但它也使我能夠使用相同的名稱,如用戶,但它將被稱爲UserDTO,向我表明我正在使用作爲ViewModel一部分的對象,從而避免命名衝突。

+0

a [DTO是一個不同的東西,雖然](http://stackoverflow.com/questions/1051182/what-is-data-transfer-object),首先,可能有一個DTO **和* *在相同的解決方案中查看模型。 – Liam 2017-03-06 11:25:40

+0

的確如此。如果出現這種情況,我可能也會選擇不同的命名約定。但好點。 – CodeMonkey 2017-03-07 19:42:58

1

我傾向於同意Mosh。

ViewModel後綴在大部分時間都變得多餘,雖然有時您可能有匹配的類名,但由於它們僅限於ViewModel名稱空間,所以它的管理非常容易。我還發現,使用奇怪的命名空間別名會傷害我的大腦,而不會在整個板子上添加我的類名。

當然,在您的演示者/控制器中,您可能會命名衝突,但這可能表示您需要更恰當地爲您的視圖命名,例如,不是用戶而是ViewUser/EditUser。

對於搜索結果和列表我發現最好突破一些東西,如IEnumerable而不是IEnumerable。後者通常意味着用戶視圖模型類最終會成爲所有用戶屬性的傾倒點,而這些用戶屬性可能在項目中可能需要,也可能不需要。這是需要注意的重要事情之一,如果你發現自己有這樣的課程,那麼你已經走上了某個地方。保持您的觀點並查看模型的描述性和特定性。如果你有很多類似的視圖模型,這個問題可能是一個更大的設計問題。一些設計師傾向於重新創建而不是重複使用現有的圖形結構。