gpt4 book ai didi

collections - AutoMapper 和接口(interface)类型的集合

转载 作者:行者123 更新时间:2023-12-04 22:47:53 26 4
gpt4 key购买 nike

我是 AutoMapper 的新手。对不起,如果这太简单了。

这是我的示例域:

我有一个篮子。它包含一个食物列表。
食物是香蕉或泡菜。


我有镜像域中每个类的 DTO。目标:从 BasketDto,将其及其内容映射到 Basket。

这是失败的代码。在最后一行之后我有一个篮子,但它充满了 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; }
}

我应该怎么做才能映射使用食物作为 IList 的 child ? Mappin 接口(interface)和层次结构真的很复杂!

非常感谢。

最佳答案

虽然@Mightymuke 的回答基于原始问题是正确的,但还有其他需要考虑的问题。从 OOP 的角度来看,接口(interface)描述行为,示例中的 IFood 不是行为。使用基类 Food 和 build-in inheritance mapping in 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");
}
}
}

关于collections - AutoMapper 和接口(interface)类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com