AutoMapper MapAtRuntime() 的作用是什么?

Hoo*_*ini 9 automapper

我在 AutoMapper 中看到过MapAtRuntime()function,这是我从 intellisense 得到的解释:

不要预先计算该成员的执行计划,只需在运行时映射它。通过不内联简化执行计划。

但它实际上有什么作用呢?我应该如何/何时使用它?

// I don't know if this is the correct usage, and what difference does it make
CreateMap<MyEntity, MyViewModel>()
    .ForMember(dest => dest.MyField, opt => opt.MapAtRuntime());
Run Code Online (Sandbox Code Playgroud)

我没能找到任何相关文档,只能找到GitHub 上的源代码

mam*_*men 2

但它实际上有什么作用呢?

我在官方文档的“编译时间长”下发现了以下内容:

编译时间随着执行计划的大小而增加,这取决于属性的数量及其复杂性。理想情况下,您可以修复模型,以便拥有许多小型 DTO,每个 DTO 都针对特定的用例。但您也可以在不更改类的情况下减小执行计划的大小。

您可以MapAtRuntime为每个成员或MaxExecutionPlanDepth全局设置(默认为 1,将其设置为零)。

这些将通过用方法调用替换子对象的执行计划来减少执行计划的大小。编译会更快,但映射本身可能会更慢。搜索存储库以获取更多详细信息,并使用分析器更好地了解效果。避免PreserveReferencesMaxDepth有帮助。

因此,通过使用.MapAtRuntime(),将不会预先计算执行计划。相反,它将在运行时进行映射。这通过不使用内联映射来简化执行计划:

public void MapAtRuntime() => PropertyMapActions.Add(pm => pm.Inline = false);
Run Code Online (Sandbox Code Playgroud)

我应该如何/何时使用它?

如果您的映射遇到性能下降并且执行计划非常复杂,您可以使用它MapAtRuntime()来再次提高性能。但是,如上所述,理想情况下,您应该降低模型的复杂性,从而提高映射的性能。