Automapper:dto对象的自动地图收集属性 [英] Automapper: Auto map collection property for a dto object
问题描述
我有一个域对象
public class ProductModel
{
public long Id {get;set;}
public string Name {get;set;}
public string SerialNumber {get;set;}
}
单个Dto类:
public class ProductDto
{
public long Id {get;set;}
public string Name {get;set;}
public string SerialNumber {get;set;}
}
单个Dto类,它是Dto对象的列表:
Single Dto class that is a list of Dto object:
public class ProductListDto : List<ProductDto>
{
public List<ProductDto> Products;
public ProductListDto()
{
Products = new List<ProductDto>();
}
}
我想将域对象的列表映射到Dto对象的列表,以使ProductListDto对象的"Products"属性自动映射到ProductModel对象的列表:
And I'd like to map a list of domain objects to list of Dto objects such that the "Products" property of ProductListDto object AUTOMATICALLY is mapped with a list of ProductModel objects:
ProductListDto dto = new ProductListDto();
Mapper.CreateMap<ProductModel, ProductDto>();
/* dto = (ProductListDto) Mapper.Map<List<ProductModel>, List<ProductDto>>((List<ProductModel>)model); this code line causes error. It is commented out. */
dto.Products = Mapper.Map<List<ProductModel>, List<ProductDto>>((List<ProductModel>)model); // (*) works OK but need to specify "Products" property
代码行(*)可以正常工作,但是我想知道是否有另一种方法可以自动(隐式)映射dto对象的"Products"属性,而不是代码行(*)?
The code line (*) works OK, but I'd like to know if there is another way to AUTOMATICALLY (implicitly) map that "Products" property of dto object other than the code line (*)?
这意味着我不必像代码行(*)的左侧那样编写代码.
That means I do not have to write code like the left hand side of code line (*).
推荐答案
您将需要为其创建映射.这样的事情应该起作用:
You will need to create a mapping for it. Something like this should work:
namespace StackOverflow
{
using System.Collections.Generic;
using AutoMapper;
public class MyProfile : Profile
{
public override string ProfileName
{
get
{
return "MyProfile";
}
}
protected override void Configure()
{
Mapper.CreateMap<ProductModel, ProductDto>();
Mapper.CreateMap<List<ProductModel>, ProductListDto>()
.ForMember(dest => dest.Products,
opt => opt.MapFrom(
src => Mapper.Map<List<ProductModel>,
List<ProductDto>>(src)));
}
}
}
然后在您的代码中可以执行以下操作:
Then in your code you can do:
dto = Mapper.Map<List<ProductModel>, ProductListDto>((List<ProductModel>)model);
以下是一些单元测试,以展示其工作原理:
Here are a couple of unit tests to show how it works:
namespace StackOverflow
{
using System.Collections.Generic;
using AutoMapper;
using NUnit.Framework;
[TestFixture]
public class MappingTests
{
[Test]
public void AutoMapper_Configuration_IsValid()
{
Mapper.Initialize(m => m.AddProfile<MyProfile>());
Mapper.AssertConfigurationIsValid();
}
[Test]
public void AutoMapper_DriverMapping_IsValid()
{
Mapper.Initialize(m => m.AddProfile<MyProfile>());
Mapper.AssertConfigurationIsValid();
var products = new List<ProductModel>
{
new ProductModel
{
Id = 1,
Name = "StackOverflow Rocks",
SerialNumber = "1234"
},
new ProductModel
{
Id = 2,
Name = "I Also Rock",
SerialNumber = "4321"
}
};
var productsDto =
Mapper.Map<List<ProductModel>, ProductListDto>(products);
Assert.That(productsDto, Is.Not.Null);
Assert.That(productsDto.Products, Is.Not.Null);
Assert.That(productsDto.Products.Count, Is.EqualTo(2));
}
}
}
这篇关于Automapper:dto对象的自动地图收集属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!