2015-07-05 34 views
0

我想實現從DTO到C#中的模型的映射。場景:SOLID並映射DTO的集合

  • 我有一個List<DTO>,並把它映射到List<ViewModel>
  • 輸入列表包含DTO派生不同類別,例如實例UserProduct
  • 我根據DTO需要不同的模型實例的結果,例如, UserModelProductModel(從ViewModel所有派生)

我的約束是:

  • 我不能使用映射器(Automapper,ValueInjecter,...)
  • 的DTO被放置在自己的圖書館,並且不知道的視圖模型(但視圖模型都知道DTO)
  • 我希望儘可能接近SOLID(我想避免基於對象類型的開關/ if語句)

現在我正在尋找一個很好的方法來實現整個事情。到目前爲止,我所創建的幫助類是Dictionary<Type, Type>,所以我可以根據DTO的類型(使用Activator)查找要實例化的視圖模型,然後在基本視圖模型中實現ViewModel.Map(DTO dto),然後在所有視圖模型類。這種Map方法需要將DTO投射到適當的類型(例如在UserModel.Map()的情況下爲User)。還有其他建議嗎?我能否以某種方式避免投射?

編輯

示例代碼:https://github.com/andy250/Sandbox(項目智能地圖)

+0

您可以在http://www.uglybugger.org/software/post/friends_dont_let_friends_use_automapper – user2864740

+0

找到一些有用的想法不幸的是這篇文章沒有解決我的問題。我找到了這個:https://visualstudiomagazine.com/Blogs/Tool-Tracker/2013/01/Picking-Overloaded-Methods-at-Runtime.aspx。但在我的情況下,我再也看不到利用這種多次派遣的方式。 – andy250

+0

您是否簽出答案? @ andy250 –

回答

0

您可以用具有用來含有Dictionary<Type,Type> map更好的辦法的對象將映射DTO類和相應的模型對象的類去,所以那map.get(DTO.class)給你的對象本身。像

Dictionary<class,Model> map; map.put(User.class, new UserModel());

否則,您可以在使用類名類型映射和ObjectFactory類中使用反射創建對象。

您還可以實現原型模式,因此有相應的類有一個靜態方法來返回自己的對象,但單和原型模式已經知道viopate抽象

0

我審查了您的解決方案,並花了一些時間來根據您的要求播放選項。這就是我爲了做你想要的東西而需要複製Automapper功能與Castle Windsor集成的一些方法。示例討論如何整合here

這是我建議使用它。

0

你可以有基於接口的每個DTO /視圖模型對自己的映射器實現

interface Mapper<TSource,TTarget> { 
    TTarget ConvertToTarget(TSource source); 
    TSource ConvertFromTarget(TTarget target); 
}