2010-12-16 85 views
1

我建設,我使用下面流動的ASP.NET MVC應用程序:AutoMapper的體系結構?

獲取實體

  1. 運行動作在控制器
  2. 從FactoryClass獲取數據,對模型進行操作(實體框架)
  3. 獲取數據返回到控制器中的操作
  4. 使用AutoMapper從Model對象轉換爲ModelView對象
  5. 迴歸模型視圖對象的強類型查看

更新實體

  1. 運行動作與模型視圖實體輸入(DefaultDataBinder將被使用)
  2. 驗證模型視圖實體
  3. 直接將ModelView對象發送給正確的工廠方法。
  4. 檢查ModelView對象是否有標識,如果是這樣從數據庫中獲取Model對象
  5. 使用AutoMapper將傳入的ModelView對象轉換爲Model對象/實體。如果其更新,則使用提取的Model對象作爲目標。
  6. 如果是更新使用刷新Client.Wins其他使用添加
  7. 運行SaveChanges並返回到控制器。

問題1

的模型視圖的類被特製用於該複合控制器操作被連接到(它可以同時包含edeting對象和列表)的意見。不同視圖的幾個動作使用相同的ModelView類是很常見的,這意味着ModelView對象中的所有對象都不會用在每個動作/視圖中。

只要查看使用可更新是沒有問題的,但ModelViewObjects的所有屬性...

說,我們得到了一些地方的ModelViewObject的屬性不使用視圖,這ModelViewObject被髮送到工廠(將被更新),在該工廠中獲取corsponding ModelObject(從數據庫/實體框架),然後用AutoMapper與ModelViewObject合併。這裏的問題是未設置ModelViewObject的屬性(未在視圖中使用)將導致在ModelObject中覆蓋實際數據。

爲了解決這個ü通常使用AutoMapper ForMember Ignor(),但這將是當完整ModelViewObject(所有屬性設置)將更新數據庫的一個問題。

你是如何處理這個問題的?在不同的AutoMapper設置下的Factorys中有不同的更新方法嗎?

這將是很好,如果我只能有一個這樣的方法:UpdateMyEnityt(myEntity所實體),這methid將更新OCH myEntity所添加的對象。

問題2

我應該在哪裏放置AutoMapper映射?到目前爲止,我已經在控制器中放置了更新獲取。我曾想過在ModelViewObject中放置映射,例如ModelViewObject.ToDataModel,但如果我不需要完整的翻譯(som屬性將被忽略),那麼我將不得不在AutoMapper中執行其他位置。

你是如何處理這個問題的?

問題3

說,你已經在我們的工廠類的工作更新方式使用AutoMapper與SOM ignors翻譯一個ModelViewObject到模型視圖(實體框架對象)。現在說我們用新的字段/屬性更新了數據庫表,如果我們運行一個視圖來處理與此表對應的ModelViewObject,但不處理新的屬性,這將意味着屬性將始終設置爲空/字符串。空/ 0。在工廠運行常規更新方法時,不會忽略此屬性,這意味着零值會覆蓋實際值。

這是一種很大的風險,這種更新將會完成,而且我不會記得在舊代碼中處理這種更新的風險。

我該如何處理?

問題4 AutoMapper有一個驗證方法,您可以檢查是否映射將成爲可能,現在我有這些驗證其中映射完成後,我應該莫比把這個在其他一些方法,其中驗證將會像應用程序啓動一樣快地執行?使用該功能時,映射中的其他問題將首先顯示。

BestRegards

+5

存在這個問題太大 - 考慮總結段落 - 這是一個Q&A論壇,不是散文寫作。 :) – RPM1984 2010-12-16 10:49:55

+0

Yhea我知道,但我討厭問題,以保持它更短,有這麼多,可以決定什麼aswear可能。 – Banshee 2010-12-16 13:54:24

回答

4

首先,你應該使用視圖模型爲每個視圖。並只提取你需要的日期。 您應該爲「困難」問題添加設備以手動映射。 我認爲AutoMapper是從Db對象到View對象的傳輸日期的錯誤方式。

+0

謝謝,但即使我決定對每個視圖和手動映射使用ViewModel,當業務實體從數據庫更新爲新的/更改的屬性時,總是會出現問題。如果應用程序很大,那麼我可能找不到破解映射。這是很久以前有幾種觀點使用相同的商業實體。 – Banshee 2010-12-16 13:41:38

+0

假設Page1需要視圖來包含複雜的類MyFilters,這個類包含了很多參數。我的Page2也需要這個班。將同一個班級同時添加到兩個視圖是否是錯誤的?如果不是的話,會有很多額外的代碼做或多或少的相同的事情。 – Banshee 2010-12-16 13:53:23

+0

如果你在不同的頁面上有相同的控件,你應該通過UI.so設計你的ViewModel。你應該使用相同的viewModel。像:具有相同屬性的Page1和Page2 MyFilter是我們頁面的視圖模型。 – 2010-12-16 14:08:58

1

問題1:如果您使用的是不同的視圖,請使用不同的ViewModel。這樣,只有顯示的屬性纔會自動映射。

問題2:不同Automapper設置在每一個項目與

Project1.AutomapperSettings.Execute(); 
Project2.AutomapperSettings.Execute(); 

在Global.asax或類似入口點。

問題3:見問題1

問題4:使用ValidationAttribute在視圖模型的屬性,讓MVC照顧它

+0

問題1:聽起來不錯,問題2:請認真解釋一下,你的意思是Mapper.Create應該放在我放置的地方,但Mapper.AssertConfigurationIsValid();應該從Gloval.asax運行?問題3:好吧,我看到問題4:我不是在談論實體驗證,而是在談論Mapper閾值(Mapper.AssertConfigurationIsValid();) – Banshee 2010-12-16 13:48:14

+0

說Page1需要視圖來包含複雜的類MyFilters,該類包含很多參數。我的Page2也需要這個班。將同一個班級同時添加到兩個視圖是否是錯誤的?如果不是的話,會有很多額外的代碼做或多或少的相同的事情。 – Banshee 2010-12-16 13:54:52

+0

問題2:應用程序加載時應該創建AutoMapper映射,因爲它們屬於一個靜態類,並且在應用程序的整個生命週期中都存在。 問題4:Mapper.AssertConfigurationIsValid();應該只能在單元測試中運行,而不能作爲應用程序邏輯afaik的一部分。 評論2:將ViewModel1映射到Model並將ViewModel2映射到Model,並考慮ViewModel的繼承。否則,你可能完全刪除ViewModels,因爲你沒有使用它們來過濾/重構你的模型? – Kaido 2010-12-16 16:14:02