2009-11-12 84 views
3

如果我不想公開我的域對象的內部狀態,但我需要顯示它們,我可以考慮三種方法。 哪些是最「正確的」(如果有的話?)。訪問視圖中的域對象

  1. 「DTO/ViewModel方式」。 這似乎是ASP.NET MVC世界中流行的方法 (特別是使用AutoMapper的 )。
  2. 「裝飾者的方法」。如果我有一個 「客戶」實體,我用一個「DisplayableCustomer」裝飾它 ,他們可以 訪問客戶的內部狀態(在大多數語言中,我已經處理了這個 )。
  3. 「interface approach」。當我這樣做 這樣:

    class Customer { 
        .... 
        public void renderWith(CustomerRenderer renderer) { 
         renderer.renderCustomer(address,name); 
        } 
    } 
    
    interface CustomerRenderer { 
        public void renderCustomer(Address address, Name name); 
    } 
    

回答

3

我投票,並廣泛使用,你的#1選項。幾個原因:

  • 允許複雜的視圖模型,比如組合我的域對象的多個列表。考慮PostViewModel Post元素和一個IList容器懸掛它。
  • 在我目前的項目中,我們已經將域驗證抽象到我們自定義的ViewModels中,並在窗體上進行一些靈活的Ajax驗證。
  • 雖然這個概念並沒有直接在模型上暴露你的域對象,但我沒有任何問題掛我的PostViewModel屬性Post。

最後一點是爲什麼的ViewModels概念確實存在。將DD對象暴露給用戶界面甚至視圖並不違反DDD,這是根據DDD和UI概念設計和預期的。您只能公開您的域中的對象才能使用,並使用服務和基礎結構鎖定/維護其狀態。所以,你沒有違反在你的用戶界面中使用實際的域對象。

它涉及到您的用戶界面的MVC概念,並試圖呈現特定的頁面/位置視圖。您可能(也將會)擁有額外的顯示元素,可能根本與該域名無關,例如僅用於UI的Progress Bar。進度條僅用於UI和應用層。它與你的域名無關。

因此,DDD解決方案,我接受的是使用HYBIRD對象,可以容納多個對象的應用/ UI層:兩個域對象和應用對象來渲染一個特定視圖。這是ViewModel的概念,其核心原因是。

ViewModel概念可以被認爲是DDD術語中的應用層非業務對象。


去題外話一點,談論一個特定的技術,ASP.NET MVC有額外的功能,以幫助使這個概念一起工作很好。它不是直接構建到ASP.NET MVC中,而是作爲Microsoft的另一個組件稱爲Futures項目。

Check out my blog post about a couple of features,唯一最有用的功能是擴展的RenderAction方法:

http://eduncan911.com/blog/html-renderaction-for-asp-net-mvc-1-0.aspx

這是旋轉起來底層控制器和調用動作方法一個非常強大的概念。這樣做大大簡化了我們的ViewModel,只關心他們渲染的視圖。我不再需要附加與視圖無關的側欄控件或其他常見數據框,導航欄等。

對於純粹的DDD原因,RenderAction與RenderPartial不同:它允許您將業務邏輯移回到其所屬的Controller中。控制器調用正確的視圖來渲染它的顯示。這嚴格遵循DDD和MVC概念。

微軟聲明,RenderAction將在明年發佈時成爲ASP.NET MVC 2.0的一部分。

很抱歉的言論...

+1

似乎的RenderAction非常相似的動作視圖助手Zend框架(http://framework.zend.com/manual/en/zend.view.helpers.html#zend .view.helpers.initial.action)。 但是,框架維護者建議不要使用它,因爲它基本上經歷了整個MVC循環,導致不需要的開銷。 RenderAction是否有這些相同的缺陷,或者它的設計是否有所不同? – blockhead 2009-11-12 18:17:33

+0

是的,它與Ruby中的Action View類似(正如您發現的那樣)。但是在Asp.Net Mvc中,輸出插入Output TextStream時效率非常高。這是Asp.Net Mvc優於Asp.Net WebForms(舊方法)的優勢。 WebForms需要旋轉整個頁面生命週期,其中Mvc不依賴頁面生命週期來在控制器類文件上呈現操作方法。 – eduncan911 2009-11-12 19:04:52