我在互联网上搜索了一些关于这个主题的文章,但没有一个人满意我。我想知道使用object-object mapper将对象映射到彼此是否合适?我知道这取决于使用情况,但我如何才能实现良好或最好的使用方式?
答案 0 :(得分:1)
退一步,最好将数据传输对象(DTO)和视图模型(VM)与业务对象(实体等)分开。在这方面,映射库是达到目的的一种手段,只是简化了这种关联。
至于何时,这取决于你。如果您希望能够以易于维护的方式在业务模型和DTO / VM之间进行转换,请继续。从我个人的经验来看,这只是到目前为止(特别是随着要求的变化)。因此,我喜欢映射库(特别是AutoMapper,因为我已经了解它的API并且很容易将其插入)。
话虽如此,每次我必须介于这两个模型之间时,我都会使用AutoMapper。我只需配置一次即可关闭并运行。对模型进行额外调整(在任何一侧)然后变得更容易,因为我可以在一个地方(地图定义文件)更改这些绑定,并且方法自动“赶上”。
示例:
我的数据库包含产品记录:
class Product
{
public int Id { get; set; }
public string Description { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public int QuantityOnHand { get; set; }
public int? ReorderQuantity { get; set; }
public string Sku { get; set; }
}
我可以用更精简的格式将其呈现给用户界面:
public class ProductViewModel
{
public int Id { get; set; }
public string Description { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public int Quantity { get; set; }
}
如果这是来自某种类型的存储库,我只是打电话:
var model = Mapper.Map<ProductViewModel>(productFromRepository)
在这里,我始终从我要求的产品中获得我关心的视图模型。如果业务/服务层要添加/更改/删除属性,我只会回到我的Mapper.CreateMap<Product, ProductViewModel>()
定义,但我的演示逻辑的其余部分将保持不变。
答案 1 :(得分:1)
除了@Brad科视Christie的回答之外,如果您想要在视图中显示它们以及以不同方式生成的其他产品,则将具有微小差异的类型自动化为单一的总体类型通常会更容易。
如果您允许我删除我之前的答案,请举例说明:
class SingleProduct {
string Name {get;set;}
decimal Price {get;set;}
decimal GetActualPrice() { return Price; }
}
class ComboSaleProduct {
string Name {get;set;}
List<SingleProduct> ComboProducts {get;set;}
decimal GetActualPrice() { return ComboProducts.Sum(p => p.GetActualPrice()); }
}
class ProductViewModel {
string Name {get;set;}
decimal ActualPrice {get;set;}
}
Automapper将所有内容连接在一起,以便您可以返回其中任何一个,它将自动映射&#34; GetActualPrice&#34;到viewmodel上的ActualPrice。