映射一 object 包含列表以列出 myDto object

Map one object contain list to list myDto object

Object 来自其他应用程序:

我可以得到它: 一个 object 这样的:

public MessageSendTMP {get; set;}

包含示例:

public string title {get; set;}
public string Author {get; set;}
public string Date {get; set;}
.....10 more and
public List<Guid> IdPlayers {get; set;}

MessageDto 是一个简单的 object,具有 20 个属性,例如数据、作者、姓名、标题等...以及消息所针对的 IDplayer。

在我的应用程序中,我必须将它保存在 message_table 中的数据库中。 我想使用 automapper,在 createMap 中使用“ForMember”将 MessageSendTMP 映射到 MessageDto,但我不知道如何。 我想在这样保存之前拥有它: List< MessageDto > dataToSave 有这么多记录作为 MessageSendTMP 中 IdPlayers 的大小

示例:

MessageSendTMP {
    title = "titleMessage",
    Author = "John",
    Date " "17-04-2021",
    .....
    IdPlayers = [2, 3, 10]
}

然后我将获得大小为 2 的 MessageDto 列表:

[0] = { title = "titleMessage", Author = "John", Date " "17-04-2021", ....., IdPlayer = 2},
[1] = { title = "titleMessage", Author = "John", Date " "17-04-2021", ....., IdPlayer = 3},
[2] = { title = "titleMessage", Author = "John", Date " "17-04-2021", ....., IdPlayer = 10}

我会忽略 IdPlayer 属性 并注册一个复制其他属性的映射。然后我会循环遍历 IdPlayers 集合,在每次迭代中我会使用 AutoMapper 创建新的 MessageDto 并手动设置 IdPlayer 属性。

缺点是您在 AutoMapper 配置文件中注册的映射不完整。如果您的映射非常简单并且您不使用高级 AutoMapper 功能,那么使用反射创建自己的映射可能对您来说是更好的选择。参见:https://dejanstojanovic.net/aspnet/2014/september/simple-object-mapper-using-reflection/

使用 ITypeConverter 进行自定义映射:

public class Message
{
    public string Title { get; set; }

    public string Author { get; set; }

    public string Date { get; set; }

    public List<Guid> IdPlayers { get; set; }
}

public class MessageDto
{
    public string Title { get; set; }

    public string Author { get; set; }

    public string Date { get; set; }

    public Guid IdPlayer { get; set; }
}

public class MessageConverter : ITypeConverter<Message, IEnumerable<MessageDto>>
{
    public IEnumerable<MessageDto> Convert(Message source, IEnumerable<MessageDto> destination, ResolutionContext context)
    {
        foreach (var playerId in source.IdPlayers)
        {
            var msg = context.Mapper.Map<MessageDto>(source);
            msg.IdPlayer = playerId;

            yield return msg;
        }
    }
}

然后:

public class Program
{
    public static void Main(string[] args)
    {
        var config = new MapperConfiguration(options =>
        {
            options.CreateMap<Message, IEnumerable<MessageDto>>(MemberList.Source).ConvertUsing<MessageConverter>();
            options.CreateMap<Message, MessageDto>();
        });

        var mapper = config.CreateMapper();

        var message = new Message
        {
            Author = "auth",
            Date = DateTime.Now.ToString(),
            title = "title",
            IdPlayers = new List<Guid> { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() }
        };

        var result = mapper.Map<Message, IEnumerable<MessageDto>>(message);

    }
}