将Viewmodels映射回Models

本文关键字:Models 映射 Viewmodels | 更新日期: 2023-09-27 17:59:13

在我的N层DDD架构中,应用层中的所有ViewModel类都实现了以下接口:

public interface IViewModel
{
    ModelEntitySuperType ToModel();
}

因此,每个ViewModel都知道如何映射回Domain Object(通过实现ToModel()方法)。

[更新]

此外,我在应用层中使用了CQRS模式,因此我定义了以下通用抽象类来实现Update命令,您可以在以下类(Handle方法)中看到ToModel()方法的用法:

public abstract class UpdateCommandHandler<TCommandParameter, TViewModel, TEntity> : ICommandHandler<TCommandParameter>
    where TCommandParameter : UpdateCommandParameter<TViewModel>
    where TViewModel : class, IViewModel, new()
    where TEntity : ModelEntitySuperType, IAggregateRoot, new()
{
    private readonly IRepository<TEntity> _repository;
    public string Code { get; set; }
    protected UpdateCommandHandler(IRepository<TEntity> repository, string commandCode)
    {
        Code = commandCode;
        _repository = repository;
    }
    public void Handle(TCommandParameter commandParameter)
    {
        var viewModel = commandParameter.ViewModelEntity;
        var entity = viewModel.ToModel() as TEntity;
        _repository.Update(entity);
    }
}

将映射逻辑放入ViewModel对象中是正确的方法吗?实现这一目标的更好方法是什么?

将Viewmodels映射回Models

通常我在进行映射的层中有映射逻辑。因此,我让实体和视图模型都不知道彼此,它们只有一个责任。数据类型之间的映射由映射库(例如AutoMapper)或扩展方法负责。

例如,如果您想将Person实体转换为PersonViewModel,那么使用AutoMapper,它将看起来像

 var viewModel = Mapper.Map<PersonViewModel>(person);

或者你可以有的扩展方法

 public static PersonViewModel ToViewModel(this Person person)
 {
     // create view model and map its properties manually
 }

用法看起来像您当前的代码,只是您不需要将ModelEntitySuperType强制转换为PersonViewModel:

 var viewModel = person.ToViewModel();