應用服務方法:(複雜
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()
};
}
}