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