将View模型映射回模型

时间:2014-04-21 06:46:37

标签: c# mapping viewmodel cqrs

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

public interface IViewModel
{
    ModelEntitySuperType ToModel();
}

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

[更新]

我在我的Application层中使用了CQRS模式,所以我为实现Update命令定义了以下通用抽象类,你可以看到跟随类中ToModel()方法的用法( Handle方法):

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个对象中吗? 有什么更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

通常我在图层中有映射逻辑来进行映射。因此,我保持两个实体和视图模型彼此不知道,他们有单一的责任。数据类型之间映射的责任转移到映射库(例如AutoMapper)或扩展方法。

E.g。如果您想将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();