1

我正在考虑在即将到来的项目中使用AutoMapper并试图找到可能的“瓶颈”。目前我能想象的最复杂的情​​况如下:一个域类,由数据库中的 3 个(例如)表表示(我的数据访问层是 LINQ to SQL)。要构建类的实例,我需要执行 3 个查询:

  1. 从表 A 中按 ID 选择(1 行,直接转到Class属性)
  2. 从表 B 中按 ID 选择(0..1 行,转到可选Class.Code属性)
  3. 从表 C 中按 ID 选择(0..N 行,进入Class.Parameters集合)

而且我不确定如何配置映射。以下是我考虑的选项:

  1. 执行 3 次查询和映射Tuple<A,B,C>->Class
  2. 使用外连接组合查询 1 和 2(更有效)。但是我如何处理匿名类型?
  3. 将 datacontext 注入映射,定义A->Class映射并让类型转换器完成工作?

没有一个看起来像胜利。你有什么建议?

编辑:嗯,这种复杂的情况很少见(10-20%),我可以手动完成,剩下的 80-90% 用 AutoMapper 就好了。但我想知道 AutoMapper 是否不是为此类策略而设计的,或者我错过了一些重要的东西。

4

2 回答 2

2

您的问题很难回答,因为域对象如何以及在何处获取其数据不是 AutoMapper 关心的问题。从AutoMapper 文档

AutoMapper 面向模型投影场景,将复杂对象模型展平为 DTO 和其他简单对象,其设计更适合序列化、通信、消息传递,或者只是域和应用程序层之间的防损坏层。

但是,这并不意味着您对 AutoMapper 的使用不应该考虑到您的域对象背后的思考过程。举个例子,延迟加载会浮现在脑海中。例如,在您的情况下,如果您对Class.Parameters属性使用延迟加载,但随后通过 AutoMapper 运行该属性,则始终会加载数据。这就是为什么坚持每个视图一个模型的规则很重要的原因。

AutoMapper 的创建者之一 Jimmy Bogard 讨论了他对 AutoMapper 中AutoMapper 的愿景:对象-对象映射器。我希望我可以直接链接到它,但在对上述博加德帖子的评论回复中说:

这是我们已经研究了一段时间的东西(双向绑定),但最后,我们发现更新中的业务验证太多了。

相反,我们围绕从消息/表单更新模型形成了其他模式。有关更多详细信息,请参阅 Code Camp 服务器源。

如前所述,您可以在CodeCampServer的源代码中找到大量使用 AutoMapper 。CodeCampServer 代码的简化版本可以在随ASP.NET MVC 2 in Action提供的源代码中找到。

于 2010-10-22T22:03:26.870 回答
1

这应该是查看您的对象模型的判断决定。

优点:

  • 如果类直接映射到实体并且类属性名称与 table.columnname 匹配,则 Automapper 很好。
  • Automapper 无缝地映射集合。
  • 您可以创建 Automapper 配置文件并验证您的配置。
  • 您可以在应用程序级别拥有一个用于日期时间、金钱等的格式化程序。
  • 您可以选择用空白或您想要的任何字符填充 NULL。
  • Ignore() 在许多情况下都派上用场。

缺点:

  • 映射中的异常有时很难调试。
  • 如果有很多解析器,你的代码看起来很混乱。
  • 在复杂的对象结构中,您可能会解决少数类的直接映射。因此不会有一致性。
于 2010-10-23T16:22:49.927 回答