Automapper问题 - 自动启动DTO,如果DTO包含另一个DTO,则ViewModel



用subdto

自动dto
class productsDTO
{
    public int id;
    public AddressDTO DeliveryAddress; 
}
Class productsViewModel
{
    public int id;
    public AddressViewModel DeliveryAddress; 
}

在这里,我有一个DTO课程。我只想将DTO类映射到视图模型中。在DTO类中,必须在productsViewModel中自动映射地址ViewModel。

如果有人有解决方案,只需发布

 var products = [some objects]; 
    products.ForEach(a =>
    { 
    var config = new MapperConfiguration(cfg =>
    { 
    cfg.CreateMap<ProductsDTO, ProductsViewModel>()
    .ForMember(dest => dest.DeliveryAddress, opts =>opts.Ignore())
    .AfterMap((src, dest) => {
    dest.DestinationAddress = 
    Mapper.Map(src.DeliveryAddress,dest.DeliveryAddress);
     }); 
    });
     IMapper iMapper = config.CreateMapper(); 
    var productList = iMapper.Map<ProductsDTO, ProductsViewModel>(a); 
products.add(productList) 
});

此代码产生这样的错误:" mapper未初始化。用适当的配置来调用初始化。如果您试图通过容器使用映射器实例或以其他方式使用映射器实例,请确保您对静态没有任何调用mapper.map方法,如果您使用projectto或useasdatasource扩展方法,请确保您通过适当的IconFigurationProvider实例。" " ">

您需要在addressDTO和addressViewModel之间添加第二个映射。当您在ProductsDTO和ProductsViewModel之间进行映射时,它也将自动映射这些属性,并且Automapper将知道映射应如何工作。

以映射productsDTO和productsViewModel的方式,您也可以映射这些类:

cfg.CreateMap<AddressDTO, AddressViewModel>();

另外,不必像现在这样做的循环中多次定义映射。映射只是一个定义,以后要使用。它只需要指定一次。当您要实际执行两个对象的映射时,然后使用Mapper.Map - 与对象一样多次使用此对象。它将使用您事先创建的映射定义。但是,每种类的组合都只需要一次调用cfg.CreateMap一次即可。我也不确定您是否需要代码中的整个"忽略"业务 - 忽略属性然后在下一行中再次映射它似乎是多余的。您也可以在单个地图操作中转换产品列表中的所有对象。

这样的事情应该更好地工作,我认为:

var config = new MapperConfiguration(cfg =>
{ 
   cfg.CreateMap<ProductsDTO, ProductsViewModel>();
   cfg.CreateMap<AddressDTO, AddressViewModel>();
});
IMapper iMapper = config.CreateMapper(); 
var products = [some objects]; 
List<ProductViewModel> productVMList = iMapper.Map<List<ProductViewModel>>(products);

首先,您映射addressdto和addressViewModel属性。如果您自动绘制相同的属性名称自动绘图器。如果您想映射具有不同名称的属性,则定义哪些属性与其他属性相等...

docs;http://docs.automapper.org/en/stable/proctive.html

在您将映射productsdto和productsViewModel和每个材料都可以正常工作。:(

最新更新