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