现在 AutoMapper 取消了静态 API 和在运行时更改映射的能力,我在没有 IoC 管理器的情况下使用我的 WebForms 应用程序时遇到了问题。
出于这个问题的考虑,我不能在这个应用程序中引入一个 IoC 管理器,虽然这将是“很好的做法”,但如果没有它,应用程序已经运行了很多年,而且它不能在此时此刻。将来可能,但不是现在。
使用 AutoMapper,我以前做的事情是在我实例化的每个类中都有一个由构造函数自动调用的方法。在那种方法中,我将有必要的:
Mapper.CreateMap<>()
来电。这具有以下优点:
- 我只映射了每个请求所需的内容(并且根据程序流程,此映射列表将增长到我需要的内容)
- 所有类型都是“本地的”——这意味着我不必在解决方案中引用其他项目
我很高兴能够忍受以这种方式执行操作的每个请求的性能,而不是在 Application_Start() 中执行一次。
但是使用 AutoMapper 5... 阅读了从静态 API 迁移的内容后,我现在必须:
- 在我可以访问我想要映射的所有类型的“某处”进行所有映射。所以无论我把它放在哪里,我都必须在我的解决方案中引用所有其他程序集?
- 将 MapperConfiguration() 实例存储在全局可访问的某个地方 - 可以说是 HttpContext 或 HttpApplication 以便我可以调用 MapperConfiguration.CreateMapper() 我现在需要确保我可以在任何地方访问 HttpContext / HttpApplication 。这最终意味着不需要说 HttpContext 的项目现在需要访问它。
如果我在上面 1. 和 2. 中的假设是正确的,那么我现在有一大堆紧密耦合的意大利面条代码。
所以我的问题是:
如何在没有 IoC 的情况下优雅地在解决方案中有大量项目(因此也有很多类型)的 webforms 应用程序中使用 AutoMapper 5?