我正在使用Web服务接收代表订单的平面DTO,我必须将订单的业务表示转换为此平面表示。
这是对象 -
DTO:
业务对象:
现在的问题是如何转换我的Order
实体?
我可以想到两种可能的解决方案:
让Order
知道如何将自己表示为DTO:OrderDTO dto = order.ToDto();
但这有明显的缺点,即业务实体知道数据表示。
通过某种转换器完成此操作:OrderDTO dto = Convertor.Convert(order);
但转换器代码必须如下所示:
if(order is OnlineOrder)
{
dto.Email =((OnlineOrder)命令).Email;
}
当然,这很可怕。
有什么建议吗?可以在这里自动化帮助(我真的不熟悉它)?
答案 0 :(得分:1)
您正在寻找一家工厂,这本质上就是您的“转换器”。您的代码看起来像:
var factory = new OrderDTOFactory();
OrderDTO orderDTO = factory.CreateOrder(order);
在工厂内,您可以通过几种不同的方式来实现它。尽管你的DTO不是很大,但Automapper在这里可能很有用并且是值得考虑的事情。对于具有许多需要传输的属性的对象,Automapper对我来说非常有用。
我不认为你的“转换器”代码真的那么糟糕。它易于阅读,但不是很容易阅读。但是如果子类的数量非常静态,那么这不是一个真正的问题吗?我不知道你怎么知道你的班级是否有一个特定的方法,或者不是更精细的反思。