映射一 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);
}
}
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);
}
}