Sup*_*JMN 4 mapping collections interface dto automapper
我是AutoMapper的新手.对不起,如果这太简单了.
这是我的示例域名:
我有一个篮子.它包含食物清单.食物是香蕉或泡菜.
我有DTO镜像域中的每个类.目标:从BasketDto,将其及其内容映射到篮子.
这是失败的代码.在最后一行之后,我有一个篮子,但它充满了DTO而不是常规实体:(
class Program
{
static void Main(string[] args)
{
Mapper.CreateMap<BasketDto, Basket>();
Mapper.CreateMap<PickleDto, Pickle>();
Mapper.CreateMap<BananaDto, Banana>();
var dto = new BasketDto
{
Food = new List<IFood>
{
new PickleDto { Name = "BigPickle" },
new BananaDto { Name = "SmallBanana" },
}
};
var basketFromDto = Mapper.Map<Basket>(dto);
}
}
// Domain classes and interfaces --------------
interface IFood
{
string Name { get; set; }
}
class Banana : IFood
{
public string Name { get; set; }
}
class Pickle : IFood
{
public string Name { get; set; }
}
class Basket
{
public IList<IFood> Food { get; set; }
}
// DTOs -------------
class BasketDto
{
public IList<IFood> Food { get; set; }
}
class PickleDto : IFood
{
public string Name { get; set; }
}
class BananaDto : IFood
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我还应该做些什么来映射使用食物作为IList的儿童?Mappin接口和层次结构非常复杂!
非常感谢.
虽然@ Mightymuke的答案在原始问题的基础上是正确的,但还有其他一些问题需要考虑.从OOP角度来看,接口描述行为,示例中的IFood不是行为.使用基类Food类和Automapper中的内置继承映射,它更自然:
namespace Stackoverflow
{
public class Food
{
public virtual string Name { get; set; }
}
public class Banana : Food
{
}
public class Pickle : Food
{
}
public class Basket
{
public IList<Food> Food { get; set; }
}
public class FoodDto
{
public virtual string Name { get; set; }
}
public class BananaDto : FoodDto
{
}
public class PickleDto : FoodDto
{
}
public class BasketDto
{
public IList<FoodDto> Food { get; set; }
}
[TestFixture]
public class InheritanceMappingTests
{
[Test]
public void Should_map_inherited_classes()
{
//arrange
var basketDto = new BasketDto
{
Food = new List<FoodDto>
{
new BananaDto {Name = "banana"},
new PickleDto {Name = "pickle"}
}
};
Mapper.CreateMap<FoodDto, Food>()
.Include<BananaDto, Banana>()
.Include<PickleDto, Pickle>();
Mapper.CreateMap<BananaDto, Banana>();
Mapper.CreateMap<PickleDto, Pickle>();
Mapper.CreateMap<BasketDto, Basket>();
Mapper.AssertConfigurationIsValid();
//act
var basket = Mapper.Map<Basket>(basketDto);
//assert
Assert.That(basket.Food[0].GetType() == typeof(Banana));
Assert.That(basket.Food[0].Name == "banana");
Assert.That(basket.Food[1].GetType() == typeof(Pickle));
Assert.That(basket.Food[1].Name == "pickle");
}
}
}
Run Code Online (Sandbox Code Playgroud)