AutoMapper和接口类型集合

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接口和层次结构非常复杂!

非常感谢.

Sun*_*nov 6

虽然@ 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)