Asp.net-Mvc

在層之間複製模型

  • August 27, 2010

在遍歷層時,執行右->左分配作為填充模型的一種方式是非常乏味的。例如:

employeeViewModel.FirstName = employeeModel.FirstName;
employeeViewModel.LastName = employeeModel.LastName;
...

因此,我們可以建構一個使用反射來複製模型的 ModelCopier:

var employeeViewModel = ModelCopier.Copy<EmployeeViewModel>(employeeModel);

這種技術極大地簡化了任務。然而,有一些事情是相當令人不安的:

  • 我們實際上已經失去了跟踪源對象和目標對象的屬性使用情況的能力。例如,查找 FirstName 屬性的用法(在 Resharper 中)不會顯示 ModelCopier 案例。
  • 如果我們更改源類或目標類的屬性名稱,我們可能會無意中導致執行時異常,因為我們可能沒有意識到我們需要同時更新源類和目標類。

一方面,我們可以使用反射,這很容易,但以可維護性為代價。頻譜的另一端非常乏味但非常易於維護。

反射(簡單而危險)<—–> 直接賦值(繁瑣且可維護)

我很好奇是否有人找到了一種折衷方案,可以輕鬆地使用反射進行複制,並具有直接分配的可維護性。

我們接受的一個解決方案是建構一個外掛,該外掛將生成擴展方法來處理每種情況的屬性分配。換句話說,建構一個可以處理繁瑣部分的工具。

編輯:

請理解,這個問題與使用哪種映射工具無關。我試圖了解我們如何在享受基於反射的映射的好處的同時享受直接分配(或屬性映射契約)提供的可維護性的好處。

可能編譯器沒有對程式碼進行必要的測試……這就是單元測試的用武之地。如果您已經為不同層中的類之間的轉換定義了一個測試(是的,您需要執行所有可能的轉換,否則您如何確定您的反射方法在生產中的每種情況下都可以工作?),只需執行測試將告訴更改屬性名稱的開發人員,該解決方案不再通過所有測試。每次要簽入原始碼時,都應該執行每個測試(單元測試,而不是集成測試)……這不應該是幾個月的編碼:))

所以我真的投票贊成使用反射的方法,用勺子測試單元測試的方法。

說真的,使用AutoMapper。它允許您設置從一種類型到另一種類型的轉換。對屬性名稱的任何更改都會破壞自動映射器的配置,而反射不會:

Mapper.CreateMap&lt;SiteDto, SiteModel&gt;();
Mapper.CreateMap&lt;SiteModel, SiteDto&gt;();

然後映射往返,您只需執行以下操作:

SiteDto dto = Mapper.Map&lt;SiteModel, SiteDto&gt;(targetModel);
SiteModel model = Mapper.Map&lt;SiteDto, SiteModel&gt;(targetDto);

引用自:https://stackoverflow.com/questions/3584567