2015-02-06 16 views
1

我有幾個對象如下圖所示的UML圖:enter image description here最佳設計模式實現從同一個接口派生不同的對象轉換

我寫了一個單頁的MVC應用程序,它處理來自同一interfce派生的所有對象並且僅在幾個屬性上有所不同。我的模型是所有可能屬性的覆蓋範圍。

事情是,當我發佈數據到DAL時,我必須使用entites而不是模型。我的控制器和視圖使用模型,但DAL方法期望實體A或實體B.

現在我想設計一個類來製作合適的覆蓋。我可以創建一個具有方法ConvertToA()和ConvertToB()的類並調用此類的方法。這是首先想到的最基本的佈局。

但是有沒有一個合適的設計模式,或者什麼可能是最靈活和有效的方式來完成這項任務?

問候。

+1

好問題,我會嘗試使用AutoMapper首先執行它。它與Model - > ViewModel轉換很好。它的可配置,所以你可以改變屬性映射,什麼不... – SBirthare 2015-02-06 12:39:16

+0

你怎麼知道給定的Model類的實例是EntityA而不是EntityB?在你的例子中,它很簡單,但總的來說可能並不明顯。例如,當實體具有相同的屬性時。 – 2015-02-06 12:44:31

回答

2

您可以使用AutoMapper進行對象到對象的轉換。在上述情況下,POST動作看起來象下面這樣:

[HttpPost] 
    public ActionResult TestAction(Model model) 
    { 
     var entityA = _mappingService.Map<Model, EntityA>(model); 
     testService.TestMethod(entityA); 

     return View(); 
    } 

您需要定義映射這樣的事情對於每個模型 - >視圖模型映射(反之亦然):

Mapper.CreateMap<EntityA, Model>(); 
    Mapper.CreateMap<Model, EntityA>(); 

如果對象是兼容的,支持轉換。你也可以配置單個對象屬性的映射,如:

Mapper.CreateMap<Order, OrderViewModel>() 
     .ForMember(o => o.OrderDescription, b => b.MapFrom(z => z.Description)) 
        .ForMember(o => o.OrderId, b => b.MapFrom(z => z.Id)); 
+0

非常感謝。快速搜索後,我嘗試了一個類似的,在https://code.msdn.microsoft.com/windowsdesktop/Data-Mapper-Design-Pattern-50ad1c32,它工作得很好。 – user3021830 2015-02-06 13:47:24

相關問題