应用服务方法:(复杂
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类,User是一个简单的实体。我们从给定的输入手动创建了一个User实体。用户实体将在实际应用程序中具有更多属性,并且手动创建它将变得乏味且容易出错。当我们想要向User和CreateUserInput添加新属性时,我们还必须更改映射代码。
我们可以使用库来自动处理映射。 AutoMapper是用于对象到对象映射的最佳库之一。ASP.NET Boilerplate定义了一个IObjectMapper 接口来抽象它,然后使用Abp.AutoMapper 包中的AutoMapper实现这个接口。
IObjectMapper接口
IObjectMapper是一个简单的抽象,它使用Map方法将对象映射到另一个对象。我们可以用这个替换上面的代码,而不是:
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是一个简单的方法,它获取源对象并创建一个新的目标对象,其类型声明为泛型参数(此示例中为User)。Map方法具有将对象映射到现有对象的重载 。假设我们已经拥有一个User实体,并希望使用一个对象来更新它的属性:
public void UpdateUser(UpdateUserInput input)
{
var user = _userRepository.Get(input.Id);
_objectMapper.Map(input, user);
}
public async Task<GetStationEditOutput> GetStationForEdit(NullableIdDto input)
{
if (input.Id.HasValue)
{
//更新
Station station = await _stationRepository.FirstOrDefaultAsync(m => m.Id == input.Id.Value);
return new GetStationEditOutput
{
Station = ObjectMapper.Map<GetStationEditDto>(station)
};
}
else
{
//创建
return new GetStationEditOutput
{
Station = new GetStationEditDto()
};
}
}