0

现在 AutoMapper 取消了静态 API 和在运行时更改映射的能力,我在没有 IoC 管理器的情况下使用我的 WebForms 应用程序时遇到了问题。

出于这个问题的考虑,我不能在这个应用程序中引入一个 IoC 管理器,虽然这将是“很好的做法”,但如果没有它,应用程序已经运行了很多年,而且它不能在此时此刻。将来可能,但不是现在。

使用 AutoMapper,我以前做的事情是在我实例化的每个类中都有一个由构造函数自动调用的方法。在那种方法中,我将有必要的:

Mapper.CreateMap<>()

来电。这具有以下优点:

  • 我只映射了每个请求所需的内容(并且根据程序流程,此映射列表将增长到我需要的内容)
  • 所有类型都是“本地的”——这意味着我不必在解决方案中引用其他项目

我很高兴能够忍受以这种方式执行操作的每个请求的性能,而不是在 Application_Start() 中执行一次。

但是使用 AutoMapper 5... 阅读了从静态 API 迁移的内容后,我现在必须:

  1. 在我可以访问我想要映射的所有类型的“某处”进行所有映射。所以无论我把它放在哪里,我都必须在我的解决方案中引用所有其他程序集?
  2. 将 MapperConfiguration() 实例存储在全局可访问的某个地方 - 可以说是 HttpContext 或 HttpApplication 以便我可以调用 MapperConfiguration.CreateMapper() 我现在需要确保我可以在任何地方访问 HttpContext / HttpApplication 。这最终意味着不需要说 HttpContext 的项目现在需要访问它。

如果我在上面 1. 和 2. 中的假设是正确的,那么我现在有一大堆紧密耦合的意大利面条代码。

所以我的问题是:

如何在没有 IoC 的情况下优雅地在解决方案中有大量项目(因此也有很多类型)的 webforms 应用程序中使用 AutoMapper 5?

4

1 回答 1

5

AutoMapper 并未废除静态 API。只是随意修改配置的部分。事实证明,在任何时候允许 Mapper.CreateMap 都会迫使我进行映射 sloooooooow。

我忘记删除的那个维基页面。以下是实际指导:

https://github.com/AutoMapper/AutoMapper/wiki/Static-and-Instance-API

及5.0升级指南:

https://github.com/AutoMapper/AutoMapper/wiki/5.0-Upgrade-Guide

整个故事是“摆脱你的 Mapper.CreateMap 调用,并将它们放在初始化中”。您可以使用配置文件来帮助您。

但是遍布整个应用程序的 Mapper.CreateMap 总是很危险。这意味着您不能使用 Mapper.AssertConfigurationIsValid,这是非常危险的跳过。如果您不能断言配置验证,则不应使用 AutoMapper。

于 2016-07-28T14:35:41.997 回答