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