Object To Object Mapping(對象到對象映射)

應用服務方法:(複雜

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()
                };
            }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章