2012-03-05 49 views
2

我正在使用Web服務接收表示訂單的扁平DTO,並且必須將訂單的業務表示轉換爲此扁平表示。
這裏有對象 -
DTO:
dto將dto轉換爲多態業務對象

業務對象:
business object

現在的問題是如何將我的Order實體?
我能想到的2個可能的解決方案:

  1. Order知道如何表現自己作爲一個DTO:OrderDTO dto = order.ToDto();
    但這有業務實體知道數據表示的明顯的缺點。

  2. 這樣做是由某種轉換器:OrderDTO dto = Convertor.Convert(order);
    但是轉換器的代碼必須看起來像這樣:

    如果(順序是網上訂單)
    {
    dto.Email =((網上訂單)順序).Email;
    } 這當然是可怕的。

有什麼建議嗎?可以在這裏automapper幫助(我不是很熟悉它)?

回答

1

您正在尋找一個工廠,這基本上就是您的「轉換器」。你的代碼看起來像這樣:

var factory = new OrderDTOFactory(); 
OrderDTO orderDTO = factory.CreateOrder(order); 

在工廠內部,你可以通過幾種不同的方式來實現它。 Automapper可能在這裏很有用,並且可以考慮一下,儘管你的DTO不是很大。 Automapper對於我來說對於有很多需要傳遞的屬性的對象來說是非常有用的。

我不認爲你的「轉換器」代碼真的很可怕。它很容易閱讀,雖然不是很可擴展。但是,如果亞類的數量相當穩定,那麼這不是一個真正的問題嗎?我不確定除了更詳細的反思之外,您的班級是否有特定的方法。

+0

如果你的業務對象的集合對應於只有一個類DTO,這是OrderDTO,你還不如提取接口「IOrder」,像這樣的: '公共抽象類訂單實現IOrder {' 申報所有子類除抽象層次結構底部的抽象外。這樣你就可以爲所有缺失的字段提供getter和setter。然後,您將能夠創建一個createOrder方法,將接口綁定的getter的所有字段複製到DTO的setter。 – 2015-06-22 05:10:18