拉到最下面,有最新的思考。
最近task都做完了,TL开始让我熟悉后端代码了,看到别人create接口有个autoMap很好奇。今天写个博客记录一下用法。
先上参数,3个 接受数据的类型,映射数据的类型,数据源
将相似的对象映射到另一个对象是很常见的。这也是乏味和重复的,因为一般两个对象(类)可能具有相似的/相同的属性映射到彼此。想象在一个典型的应用服务的方法:
public class UserAppService : ApplicationService
{
private readonly IRepository<User> _userRepository;
public UserAppService(IRepository<User> userRepository)
{
_userRepository = userRepository;
}
public void CreateUser(CreateUserInput input)
{
var user = new User
{
Name = input.Name,
Surname = input.Surname,
EmailAddress = input.EmailAddress,
Password = input.Password
};
_userRepository.Insert(user);
}
}
createuserinput是一个简单的DTO和用户这是一个简单的实体。我们从给定输入手动创建了一个用户实体。用户实体在实际应用程序中具有更多的属性,手工创建它将变得单调乏味,容易出错。同时,我们应该改变映射的代码时,我们要对用户和createuserinput添加新的属性。
我们可以使用一个库来自动绘制这个映射。AutoMapper是一个对象到对象的映射最好的库。ASP.NET的模板定义iobjectmapper接口抽象和实现这个接口使用AutoMapper Abp.AutoMapper包。
public class UserAppService : ApplicationService
{
private readonly IRepository<User> _userRepository;
private readonly IObjectMapper _objectMapper;
public UserAppService(IRepository<User> userRepository, IObjectMapper objectMapper)
{
_userRepository = userRepository;
_objectMapper = objectMapper;
}
public void CreateUser(CreateUserInput input)
{
var user = _objectMapper.Map<User>(input);
_userRepository.Insert(user);
}
}
map是获取源对象并创建一个新的目标对象的简单方法,该对象声明为泛型参数(本示例中的用户)。映射方法具有将对象映射到现有对象的重载。假设我们已经有一个用户实体,并且想通过对象更新它的属性:
public void UpdateUser(UpdateUserInput input)
{
var user = _userRepository.Get(input.Id);
_objectMapper.Map(input, user);
}
2022/4/27
今天对于映射的再次思考🤔
起因是这样的,如果两个对象都是一样的属性一样的值,如果不使用映射呢?直接把原对象传进去不久可以了嘛?
想了半天。。。回去把代码翻来覆去看了看。。。终于搞明白了。
举个例子, 函数A只接受FirstTypeDTO类型的数据
function A(FisrtTypeDTO){
...
}
这时候接口传回来的值,不是此类型,但是属性和FirstTypeDTO一模一样。
class FirstTypeDTO{
Prop1{
get;set;
}
}
class SecondTypeDTO{
Prop{
get;set;
}
}
主函数体内,某函数只接受FirstTypeDTO类型,那么就需实现对象映射,从SecondTypeDTO到FirstTypeDTO,这样就不会出错。
2022/4/29 新的思考
明天就是五一了,今天把源码看一下。最常用的。
看了看项目里的代码,发现形式参数的TSource可以省略。。。不看一下源码我还真是有点懵逼。。。