将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
对象中是正确的方法吗?实现这一目标的更好方法是什么?
通常我在进行映射的层中有映射逻辑。因此,我让实体和视图模型都不知道彼此,它们只有一个责任。数据类型之间的映射由映射库(例如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();