既然AutoMapper正在废除静态API和在运行时更改映射的能力,那么在没有IoC管理器的情况下,我的WebForms应用程序出现了问题。
为了解决这个问题,我不能在这个应用程序中引入IoC管理器,虽然这是"很好的",但多年来,如果没有它,应用程序一直运行良好,目前无法正确完成。也许在未来,但不是现在。
使用AutoMapper,我以前所做的是在我实例化的每个类中都有一个由构造函数自动调用的方法。在这种方法中,我将拥有必要的:
Mapper.CreateMap<>()
电话。这具有以下优点:
- 我只映射了每个请求所需的内容(根据程序流程,此映射列表将增长到我所需的)
- 所有类型都是"本地"的,这意味着我不必在解决方案中引用其他项目
我很高兴能接受这样做的每个请求的性能,而不是在Application_Start()中做一次。
然而,对于AutoMapper 5…已经阅读了从静态API迁移的内容,现在看来我必须:
- 在我有权访问的"某个地方"执行所有映射—我想映射的所有类型。所以,无论我把它放在哪里,我都必须引用解决方案中的其他所有程序集
- 将MapperConfiguration()实例存储在全局可访问的位置后,比如说HttpContext或HttpApplication,这样我就可以调用MapperConfiguration。CreateMapper()我现在需要确保我可以访问HttpContext/HttpApplication无处不在。这最终意味着不需要说HttpContext的项目现在需要访问它
如果我在1&2.以上都是正确的,我现在有一大堆紧密耦合的意大利面条代码。
所以我的问题是:
如何在解决方案中有许多项目(因此有许多类型)的webforms应用程序中使用AutoMapper 5,而不优雅地使用IoC?
AutoMapper没有废除静态API。只是随意修改配置的部分。事实证明,允许Mapper.CreateMap在任何时候都会迫使我让映射变得缓慢。
我忘记删除的那个wiki页面。以下是实际指南:
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。