AutoMapper 如何根据上下文以不同方式将对象 A 映射到对象 B

2023-11-27

呼叫所有 AutoMapper 专家!

我希望能够根据运行时的上下文以不同的方式将对象 A 映射到对象 B。特别是,我想忽略一种映射情况下的某些属性,并在另一种情况下映射所有属性。

我遇到的是 Mapper.CreateMap 可以在不同的映射情况下成功调用,但是,一旦调用 CreateMap,就会设置特定类型对的映射,并且随后不会通过可能描述映射的后续 CreateMap 调用进行更改不同。

我发现一篇博客文章提倡使用 Mapper.Reset() 来解决这个问题,但是,Mapper 类的静态性质意味着发生碰撞和崩溃只是时间问题。

有没有办法做到这一点?

我认为我需要的是每个应用程序域调用一次 Mapper.CreateMap ,然后能够调用 Mapper.Map 并提示应包含/排除哪些属性。

现在,我正在考虑通过编写一个包含基于映射配置实例的非静态映射类来更改源代码。性能较差,但线程安全。

我有什么选择。可以做什么? Automapper 看起来很有前途。


只是为了补充吉米的答案,这里是在没有静态映射器的情况下使用 AutoMapper 所需的代码

自版本 4.2.1 起Automapper 有一个经过认可的非静态映射器和配置(感谢 Jimmy!)。

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<ClassA, ClassB>();
});

var mapper = config.CreateMapper();

新版本中还有许多其他有用的选项(例如配置文件)用于创建不同的映射器实例。 您可以在官方文档

(适用于版本 4.1.1)

// Configuration
AutoMapper.Mappers.MapperRegistry.Reset();
var autoMapperCfg = new AutoMapper.ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers);
var mappingEngine = new AutoMapper.MappingEngine(autoMapperCfg);
autoMapperCfg.Seal();

//Usage example
autoMapperCfg.CreateMap<ClassA, ClassB>();

var b = mappingEngine.Map<ClassB>(a);

(适用于版本 3.2.1)

// Configuration
var platformSpecificRegistry = AutoMapper.Internal.PlatformAdapter.Resolve<IPlatformSpecificMapperRegistry>();
platformSpecificRegistry.Initialize();

var autoMapperCfg = new AutoMapper.ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers);
var mappingEngine = new AutoMapper.MappingEngine(autoMapperCfg);

//Usage example
autoMapperCfg.CreateMap<ClassA, ClassB>();

var b = mappingEngine.Map<ClassB>(a);

(适用于版本 2.2.1)

// Configuration
var autoMapperCfg = new AutoMapper.ConfigurationStore(new AutoMapper.TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.AllMappers());
var mappingEngine = new AutoMapper.MappingEngine(autoMapperCfg);

//Usage example
autoMapperCfg.CreateMap<ClassA, ClassB>();

var b = mappingEngine.Map<ClassB>(a);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AutoMapper 如何根据上下文以不同方式将对象 A 映射到对象 B 的相关文章

  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • Automapper - 具体对象到数组

    我需要将一些值从类映射到数组 例如 public class Employee public string name public int age public int cars 必须转换为 age cars 我尝试过这个 var empl
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 使用 C# 读取 Soap 消息

  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单

随机推荐

  • 为什么我的 Runnable Jar 文件不起作用

    我遵循了大约 10 个不同的教程 但似乎没有一个能够解决问题 我的可运行 jar 文件就是无法工作 My 游戏运行良好当我在 eclipse 中运行它时 我是能够将其制作成可运行的 jar 文件仅一两天前 并没有更改太多代码 当我尝试运行
  • 对象内的匿名函数

    我有一个像这样的 Javascript 片段 var a ac 10 function console log hi 浏览器不会为此抛出错误 所以这可能是有效的 但是当我使用 var a ac 10 function hi console
  • Python 脚本的文件名和行号

    如何获取Python脚本中的文件名和行号 正是我们从异常回溯中获取的文件信息 在这种情况下没有引发异常 感谢 mcandre 答案是 python3 from inspect import currentframe getframeinfo
  • 使用 TLS 会话重用将文件上传到 C# 中的隐式 FTPS 服务器

    我正在尝试通过协议 TLS 通过 ftps 将文件上传到 FileZilla 服务器 服务器上的20和21端口被关闭 我设法连接到服务器的唯一方法是使用 FluentFTP 但由于某些 FileZilla 服务器错误 我无法上传文件 htt
  • Firestore 规则模拟器 - 资源未定义

    我正在尝试使用 firebase 提供的新规则模拟器工具 但是在使其正常工作时遇到问题 在模拟器面板中这样设置路径时 users Gd9jd3jd8sSixxx38djSs 然后选择身份验证选项并输入授权用户的 uid 作为相同的字符串 G
  • 将 blob 文件上传到 Amazon s3

    我正在使用 ngCropImage 裁剪图像并希望将其上传this link NgCropImage 指令返回图像的 dataURI 我将其转换为 blob 转换后我得到一个 blob 对象 它具有大小和类型 使用以下代码将 DataURI
  • 如何修复:TypeError“元组”对象不支持项目分配[重复]

    这个问题在这里已经有答案了 本教程的以下代码片段 http www raywenderlich com 24252 beginning game programming for teens with python for badguy in
  • git Push 在 HTTP/1.1 100 之后挂在(哑)https 上继续

    我正在努力推动一些改变 但是git push挂起 当我跑步时git push 我没有看到任何输出 似乎什么也没有发生 没有任何活动top 并且没有发生任何事情的迹象 我不控制 git 托管服务 我正在使用 HTTPS URL 我相信托管服务
  • Tomcat连接池耗尽

    我在我的项目中使用 Apache Tomcat JDBC 连接池 我很困惑 因为在重负载下我不断看到以下错误 12 26 36 410 ERROR http XX XXX XXX X XXXXX X org apache tomcat jd
  • mysqldump 仅转储具有特定前缀的数据库

    我有大约 100 个不同的数据库 我想使用 mysqldump 转储以前缀 asd 开头的数据库 我尝试了这个 但它不起作用 mysqldump u user p pwd h server url asd single transactio
  • 在 Swift 中更改导航栏颜色

    我使用选择器视图来允许用户选择整个应用程序的颜色主题 我计划更改导航栏 背景和可能的选项卡栏的颜色 如果可能的话 我一直在研究如何做到这一点 但找不到任何 Swift 示例 谁能给我一个我需要用来更改导航栏颜色和导航栏文本颜色的代码示例 选
  • Angular 2 - Jquery | Angular 2 - Jquery | Angular 2 - Jquery | Angular 2 - Jquery使用鼠标位置添加样式(上/左)

    我正在寻找一种在 Angular 2 中的特定位置 鼠标事件 x y 添加 div 组件的方法 https jsfiddle net lennartquerter w2c7uqw6 this xPos xPos this yPos yPos
  • 在 Vim 中映射 Esc 键

    I m a beginning Vim user I hate pressing the Esc key which is a little far on my T61 In order to return to command mode
  • Android:EditText 中多行且无自动建议

    是否可以有一个允许多行且不显示建议的 EditText 我尝试使用以下代码 android inputType textFilter textMultiLine 我在这个中看到了question 但这对我不起作用 如果我尝试同时使用两者 E
  • 使用 Lodash 将 JavaScript 数组拆分为块

    我需要将 JavaScript 数组拆分为n大小的块 例如 给定这个数组 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 and a n等于 4 输出应该是这样的 a1 a2 a3 a4 a5 a6 a
  • Jquery——任何事件都会触发动作[重复]

    这个问题在这里已经有答案了 jquery 中是否有任何事件触发时会触发函数的东西 我想要这样的东西 anyEvent function error html on blur change click dblclick error focus
  • WKWebView reload() 无法刷新当前页面

    离线时第一次加载网页失败 然后我连接网络呼叫reload 刷新当前页面 但这不起作用 WKNavigationDelegate无法得到任何回调 功能reloadFromOrigin 也不工作 但医生说 abstract Reloads th
  • .net mvc 中从 Bootstrap 3.7 更新到 5.0.2 产生错误 - System.NullReferenceException

    我卸载了 net MVC 应用程序附带的基本引导模板 并从 NuGetPackage Manager 安装了引导程序 5 0 2 现在我在运行时遇到这个问题 构建正在成功发生 System NullReferenceException HR
  • 在 F# 中将列表拆分为两个相等的列表

    我对 F 确实很陌生 我需要一些关于 F 问题的帮助 我需要实现一个剪切函数 将列表分成两半 以便输出 切 1 2 3 4 5 6 val it int 列表 int 列表 1 2 3 4 5 6 我可以假设列表的长度是偶数 我还希望定义一
  • AutoMapper 如何根据上下文以不同方式将对象 A 映射到对象 B

    呼叫所有 AutoMapper 专家 我希望能够根据运行时的上下文以不同的方式将对象 A 映射到对象 B 特别是 我想忽略一种映射情况下的某些属性 并在另一种情况下映射所有属性 我遇到的是 Mapper CreateMap 可以在不同的映射