【问题标题】:Map one object contain list to list myDto object映射一个对象包含列表以列出 myDto 对象
【发布时间】:2021-04-17 18:15:25
【问题描述】:

来自其他应用程序的对象:

我可以得到它: 像这样的一个对象:

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 是一个简单的对象,具有 20 个属性,例如数据、作者、姓名、标题等...以及消息的 IDplayer。

在我的应用程序中,我必须将其保存在 message_table 的数据库中。 我想使用 automapper,我会在哪里将 MessageSendTMP 映射到 MessageDto,在 createMap 中使用“ForMember”,但我不知道如何。 我想在这样保存之前拥有它: List 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}

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    使用 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);
    
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-16
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-17
        相关资源
        最近更新 更多