Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将视图模型(DTO)自动映射到模型(实体)的最佳实践_C#_Asp.net_Automapper - Fatal编程技术网

C# 将视图模型(DTO)自动映射到模型(实体)的最佳实践

C# 将视图模型(DTO)自动映射到模型(实体)的最佳实践,c#,asp.net,automapper,C#,Asp.net,Automapper,我很高兴在一些项目中使用AutoMapper,并在从ViewModel切换到另一个模型时使用了.ReverseMap()。我通常会做以下工作: // run at startup // I'd customize the mapping if needed Mapper.CreateMap<Model, ViewModel>().ReverseMap(); [HttpPost] public ActionResult Create(SomeModel viewModel) {

我很高兴在一些项目中使用AutoMapper,并在从ViewModel切换到另一个模型时使用了
.ReverseMap()
。我通常会做以下工作:

// run at startup
// I'd customize the mapping if needed
Mapper.CreateMap<Model, ViewModel>().ReverseMap();

[HttpPost]
public ActionResult Create(SomeModel viewModel)
{
    var data = Mapper.Map<Model>(viewModel);
    _repo.Insert(data);
    _uow.Save();
    return View();
}
//启动时运行
//如果需要,我会自定义映射
Mapper.CreateMap().ReverseMap();
[HttpPost]
公共操作结果创建(SomeModel viewModel)
{
var data=Mapper.Map(viewModel);
_回购插入(数据);
_uow.Save();
返回视图();
}
然后我发现这篇文章:

我有空

这篇文章是过时了还是有更好的方法?

首先是免责声明:有各种不同的领域和体系结构,这个答案可能根本不适用于您的设计目标或体系结构。你当然可以随意使用AutoMapper。另外,我没有写这篇文章,所以我用自己在某些类型的项目中的经验来给出答案


域层的重要性 首先,本文假设您使用的是某个版本的。至少,我要说,它吸引了一个领域的想法,这个领域是项目的一个非常重要的部分,应该受到“保护”。这个想法的最佳总结是:

…因为这样我们的映射层就会影响我们的域模型

作者不希望域层之外的工件更新域

为什么??因为:

  • 域模型是项目的核心
  • 对域层的修改应该是一项严肃的操作——最重要的部分由域层本身处理
本文提到了允许解决方案的映射部分进行域模型更新的几个问题,包括:


强制可变的公共集合,比如
public EntitySet Categories{get;}
文章中到底是什么让你感到困扰?好吧,这篇文章就是一个整体。但这句话总结道:“我一辈子都不明白为什么我想直接将数据转储回模型对象。”一如既往,这取决于域的复杂性。如果您觉得可以轻松地将DTO映射回实体,那么双向映射对您是有好处的。对于复杂的领域模型,它有时根本无法工作。我明白了,谢谢。假设在这些复杂场景中使用手动映射,我是否正确?我认为核心问题是使用“一个DTO来管理所有DTO”。在复杂的场景中,通常无法传回相同的“读取DTO”(实体->DTO),而是创建一个特定于请求操作的特殊DTO,因此最终会得到一个“命令”(这只是我的想法,显然还有其他方法)。ReverseMap主要用于DTO DTO映射。如ViewModel->Command等。