C# 将视图模型映射回模型

C# 将视图模型映射回模型,c#,mapping,viewmodel,cqrs,C#,Mapping,Viewmodel,Cqrs,在我的N层DDD体系结构中,应用层中的所有我的ViewModel类都实现以下接口: public interface IViewModel { ModelEntitySuperType ToModel(); } 因此,每个ViewModel都知道如何映射回域对象(通过实现ToModel()方法) [更新] 我还在应用层中使用了CQRS模式,因此我定义了以下通用抽象类来实现Update命令,您可以在下面的类(Handlemethod)中看到ToModel()方法的用法: 公共抽象类Upd

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

public interface IViewModel
{
    ModelEntitySuperType ToModel();
}
因此,每个
ViewModel
都知道如何映射回
域对象
(通过实现
ToModel()
方法)

[更新]

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

公共抽象类UpdateCommandHandler:ICommandHandler
其中TCommandParameter:UpdateCommandParameter
其中TViewModel:class,IViewModel,new()
其中tenty:modeletitysupertype,IAggregateRoot,new()
{
专用只读IRepository存储库;
公共字符串代码{get;set;}
受保护的UpdateCommand处理程序(IRepository存储库,字符串命令代码)
{
代码=命令代码;
_存储库=存储库;
}
公共无效句柄(TCommandParameter commandParameter)
{
var viewModel=commandParameter.ViewModelEntity;
var entity=viewModel.ToModel()作为tenty;
_更新(实体);
}
}
将映射逻辑放入
ViewModel
对象中是否正确?
实现这一目标的更好方法是什么?

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

例如,如果要将
个人
实体转换为
个人视图模型
,则使用AutoMapper时,它将如下所示

 var viewModel = Mapper.Map<PersonViewModel>(person);
用法与当前代码类似,只是不需要将
modelentitypsupertype
强制转换为
PersonViewModel

 var viewModel = person.ToViewModel();

谢谢Sergey,我更新了问题。如果我想使用自动映射器进行映射,我应该将
var entity=viewModel.ToModel()替换为tenty
to
var entity=AutoMapper.Mapper.Map(viewModel)作为tenty?我直接在代码中使用了
Automapper
是正确的,还是应该定义一个IObjectMapper接口并将其注入到CommandHandler中?您能用代码指导我吗?@Masoud如果您在AutoMapper中配置了从TypeA到TypeB的映射,那么您可以创建
UpdateCommand Handler
并使用
Mapper.map(instanceOfTypeA)
映射类型,但我不想更改
UpdateCommand Handler
定义。因为如果我将其更改为您所说的,我必须为每个实体类型创建单独的
UpdateCommandHandler
类。例如,
updateCommand处理程序
。因此,对于当前的
UpdateCommandHandler
防御,我应该将类似IObjectMapper的东西注入到我的commandhandler中,还是直接在
Handle
方法中使用automper?@Masoud抱歉,我从来没有说过要更改UpdateCommandHandler的定义
 public static PersonViewModel ToViewModel(this Person person)
 {
     // create view model and map its properties manually
 }
 var viewModel = person.ToViewModel();