【发布时间】:2013-11-01 17:20:30
【问题描述】:
假设我有一个名为 IConvertableModel 的接口,它可以帮助我将一些 MVC 模型与 DTO 对象相互转换,如下所示:
public class DisplayEditModel : IConvertableModel<Display>
{
[HiddenInput(DisplayValue = false)]
public int ObjectId { get; set; }
[StringLength(255)]
public string Description { get; set; }
public Display ToDto()
{
return new Display
{
Description = Description,
ObjectId = ObjectId,
};
}
public void SetFromDto(Display dto)
{
Description = dto.Description;
ObjectId = dto.ObjectId;
}
}
但是这种方法有一个问题,那就是它不允许我这样做:
var dto = _dtoRepository.GetFirstDto();
return new DisplayEditModel().SetFromDto(dto);
相反,我应该执行以下操作:
var dto = _dtoRepository.GetFirstDto();
var model = new DisplayEditModel();
model.SetFromDto(dto);
return model;
从长远来看,这会增加额外的两行代码和一点点复杂性。
我的想法是将SetFromDto 方法转换成这样的:
public DisplayEditModel SetFromDto(Display dto)
{
Description = dto.Description;
ObjectId = dto.ObjectId;
return this;
}
我认为这段代码的好处是显而易见的,但我也想了解这是否会损害代码的可读性,并从长远来看会给开发人员带来意想不到的结果,如果你有其他想法,你会推荐什么。
注意:由于接口的原因,我没有考虑实现构造方法。
【问题讨论】:
-
听起来理想的方法是静态工厂或构造函数,但不幸的是,我认为这两种方法都不能实现接口强制。
-
@David,你是对的,对的,对的。
-
这不正是 AutoMapper 的发明目的吗?为什么要自己动手?
-
@DanM:因为 AutoMapper 有其邪恶的一面。当您更改某些内容时,它不会给您适当的编译时错误,并且会在运行时崩溃。所以我想明确指定要映射的内容并获得良好的旧编译时异常。
标签: c#