2010-02-15 72 views
2

我想通過使用視圖模型來清理ASP.NET MVC項目中的操作方法。目前,我的視圖模型包含可能與其他實體有關係的實體。例如,ContactViewModel類可能有一個Contact,它可能有一個Address,它們都是獨立的實體。要查詢聯繫人對象的列表,我可能會執行以下操作。ASP。 NET MVC:映射實體以查看模型

IList<Contact> contacts; 

using (IContactRepository repository = new ContactRepository()) 
{ 
    contacts = repository.Fetch().ToList(); 
} 

EditContactViewModel vm = new EditContactViewModel(contacts); 

return View(vm);

這種方法帶來一些問題。例如,在使用語句中查詢存儲庫。在視圖呈現時,上下文已超出範圍,使視圖無法查詢與聯繫人關聯的地址。我可以啓用急切的加載,但我寧願不。此外,我不喜歡實體模型已經滲透到我的觀點中(我覺得我的視圖對聯繫人和地址之間的關係有所瞭解,但隨時可以不同意我的看法是一個壞主意)。

我曾考慮過創建一個包含Contact和Address實體的屬性的肥沃類。然後,我可以將聯繫人和地址實體投影到我的新扁平物體中。我對這種方法的擔心之一是我的操作方法可能會有點忙,我不認爲認爲 AutoMapper能夠將兩個或多個對象映射到單一類型。

什麼技術是/首選克服我的顧慮?

回答

3

Automapper將適用於您的情況。你有什麼是一個對象圖,一件事有更多的東西,哪些Automapper處理好。

+0

非常酷。我對AutoMapper還是一個新手,所以我甚至不知道它可以像這樣映射。非常感謝你。 – senfo 2010-02-16 03:15:58

1

考慮這些問題,以便...

首先,如果你是擔心使用語句和存儲庫(我不知道這是否是LINQ到SQL或LINQ到實體,但它並不重要),我建議你做的是在您的Controller上實現IDisposable,然後將該存儲庫存儲在模型或控制器中的某個字段中,或者在視圖中有權訪問它的地方(如果你需要它,如果模型在對象「活着」的時候已經知道它,那麼你只需要在控制器的生命週期中保持它。

然後,當請求完成時,控制器上的Dispose方法被調用,您可以在那裏處置存儲庫。

個人而言,我有我的控制器基類中的方法,該方法是這樣的:

protected T AddDisposable<T>(T disposable) where T : class, IDisposable 
{ 
    // Error checking. 
    if (disposable == null) throw new ArgumentNullException("disposable"); 

    // Add to list 
    ... 
} 

基本上,它允許你存儲了IDisposable實現,那麼在IDisposable的實現該控制器,它循環訪問清單,處理一切。

關於地址在實體模型上的暴露,我個人認爲這不是流血問題。該地址是聯繫人(海事組織)的組成部分,所以不是會出現在那裏。

但是,如果你不想要它,因爲你要專注於一個類型在一個控制器在同一時間,我不同意這一點,等等,等等

爲此,你會想創建數據傳輸對象,該對象基本上是在視圖模型中顯示的類型與實體模型之間映射的。