我有一个 .Net 5 的 Web Api 项目,想要使用 Mapster v7.2.0 来避免手动映射对象。以下代码展示了一个简单的场景:
- 设置映射配置 - 从多个源映射 - 将不同名称的字段映射到目标
运行应用程序时,这种映射方式似乎很好地起作用了。
我不得不以这种方式设置配置,其他方式对我来说不起作用。但是还有三件事情需要解决:
1.配置看起来对我来说似乎不正确。它将所有任务映射到一个 TODO 中,并再次映射特殊字段...所以它可能会多次循环遍历?如果存在多个名称不同的字段,则这可能会变得昂贵。
2.我在控制器内创建了配置。如何创建一个可重复使用的映射配置类并全局注册?
3.当有一个映射配置文件时,这一行代码 `var usernameWithTodoTitle = (user, todo).Adapt<(User, Todo), UsernameWithTodoTitle>();` 看起来很凌乱。更好的方式是 `var usernameWithTodoTitle = UsernameWithTodoTitle.Adapt((user, todo)) /* 作为元组传递 */`,因为它根据参数类型选择正确的映射配置文件。
你们有什么想法如何创建这样一个映射配置文件吗?
- 设置映射配置 - 从多个源映射 - 将不同名称的字段映射到目标
[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
[HttpGet]
public ActionResult<UsernameWithTodoTitle> Get()
{
TypeAdapterConfig<(User, Todo), UsernameWithTodoTitle>
.NewConfig()
.Map(dest => dest, src => src.Item1) // map everything from user
.Map(dest => dest, src => src.Item2) // map everything from todo
.Map(dest => dest.TodoTitle, src => src.Item2.Title); // map the special fields from todo
var user = new User { Username = "foo", FieldFromUser = "x" };
var todo = new Todo { Title = "bar", FieldFromTodo = "y" };
var usernameWithTodoTitle = (user, todo).Adapt<(User, Todo), UsernameWithTodoTitle>();
return Ok(usernameWithTodoTitle);
}
}
public class User
{
public string Username { get; set; }
public string FieldFromUser { get; set; }
}
public class Todo
{
public string Title { get; set; } // !! map this one to the TodoTitle field !!
public string FieldFromTodo { get; set; }
}
public class UsernameWithTodoTitle
{
public string Username { get; set; }
public string TodoTitle { get; set; } // !! this one is special, is has a different name !!
public string FieldFromUser { get; set; }
public string FieldFromTodo { get; set; }
}
运行应用程序时,这种映射方式似乎很好地起作用了。
我不得不以这种方式设置配置,其他方式对我来说不起作用。但是还有三件事情需要解决:
1.配置看起来对我来说似乎不正确。它将所有任务映射到一个 TODO 中,并再次映射特殊字段...所以它可能会多次循环遍历?如果存在多个名称不同的字段,则这可能会变得昂贵。
2.我在控制器内创建了配置。如何创建一个可重复使用的映射配置类并全局注册?
3.当有一个映射配置文件时,这一行代码 `var usernameWithTodoTitle = (user, todo).Adapt<(User, Todo), UsernameWithTodoTitle>();` 看起来很凌乱。更好的方式是 `var usernameWithTodoTitle = UsernameWithTodoTitle.Adapt((user, todo)) /* 作为元组传递 */`,因为它根据参数类型选择正确的映射配置文件。
你们有什么想法如何创建这样一个映射配置文件吗?