【问题标题】:converting from dto to polymorphic business object从 dto 转换为多态业务对象
【发布时间】:2012-03-05 15:14:11
【问题描述】:

我正在使用接收表示订单的平面 DTO 的 Web 服务,我必须将订单的业务表示转换为此平面表示。
这是对象-
DTO:

业务对象:

现在的问题是如何转换我的Order 实体?
我可以想到两种可能的解决方案:

  1. Order 知道如何将自己表示为 DTO:OrderDTO dto = order.ToDto();
    但这具有业务实体知道数据表示的明显缺点。

  2. 由某种转换器完成此操作:OrderDTO dto = Convertor.Convert(order);
    但转换器代码必须如下所示:

    如果(订单为 OnlineOrder)
    {
    dto.Email = ((OnlineOrder)order).Email;
    } 当然,这很糟糕。

有什么建议吗? automapper 可以在这里帮忙吗(我不是很熟悉)?

【问题讨论】:

    标签: c# dto


    【解决方案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。
    猜你喜欢
    • 2013-08-17
    • 2021-01-12
    • 1970-01-01
    • 2011-01-11
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多