从DTO转换为多态业务对象

3
我正在使用Web服务,该服务接收一个扁平化的DTO来表示订单。我需要将我的业务表示转换为这个扁平化表示。
以下是对象:
DTO:
dto

业务对象:
business object

现在问题是如何转换我的Order实体?我可以想到两种可能的解决方案:
  1. 让Order自己知道如何表示自己作为DTO: OrderDTO dto = order.ToDto();
    但这显然有一个缺点,即业务实体知道数据表示。

  2. 通过某种类型的转换器完成:OrderDTO dto = Convertor.Convert(order);.
    但转换器代码看起来会像这样:

    if (order is OnlineOrder)
    {
    dto.Email = ((OnlineOrder)order).Email;
    } 这显然很糟糕。

有什么建议吗?Automapper能帮助吗(我对它不太熟悉)?
1个回答

1

你正在寻找一个工厂,这本质上就是你的“转换器”。你的代码应该长这样:

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

在工厂内,您可以以几种不同的方式实现它。Automapper可能在这里很有用,值得考虑,尽管您的DTO并不是很大。Automapper对于需要传输许多属性的对象最有用。

我认为您的“转换器”代码并不是真的那么糟糕。它很容易阅读,尽管不太可扩展。但是,如果子类的数量相当静态,那么这就不是一个问题了,不是吗?我不确定除了更细粒度的反射之外,您还能以什么其他方式告诉您的类是否具有特定方法。


如果您的业务对象集对应于一个DTO类,即OrderDTO,则可以提取一个接口"IOrder",如下所示:public abstract class Order implements IOrder {除了层次结构底部的子类之外,声明所有子类为抽象类。这样,您将能够为所有缺失字段提供getter和setter。然后,您将能够创建一个createOrder方法,该方法将从绑定接口的getter复制所有字段到DTO的setter中。 - Rick Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接