我在 ASP.NET MVC
应用程序中使用 AutoMapper
. 有人告诉我,我应该把 AutoMapper.CreateMap
移到其他地方,因为他们有很多开销 . 我不太确定如何设计我的应用程序将这些调用放在一个地方 .
我有一个Web层,服务层和数据层 . 每个项目都有自己的 . 我使用 Ninject
来DI一切 . 我将在Web和服务层中使用 AutoMapper
.
那你为 AutoMapper
的CreateMap设置了什么?你把它放在哪里?你怎么称呼它?
10 回答
不是't matter, as long as it'是一个静态类 . 这都是关于惯例的 .
我们的惯例是每个"layer"(web,services,data)都有一个名为
AutoMapperXConfiguration.cs
的文件,其中有一个名为Configure()
的方法,其中X
是该层 .然后
Configure()
方法为每个区域调用private
方法 .以下是我们的Web层配置示例:
我们为每个“聚合”(用户,帖子)创建一个方法,因此事情很好地分开 .
然后你的
Global.asax
:它有点像“单词界面” - 不能强制执行它,但是你期望它,所以你可以在必要时编码(和重构) .
EDIT:
我想我现在提到我现在使用AutoMapper profiles,所以上面的例子变成:
更清洁/更强大 .
只要您的Web项目引用它所在的程序集,您就可以将其放在任何位置 . 在您的情况下,我会将其放在服务层中,因为Web层和服务层可以访问它,如果您决定做一个控制台应用程序或者您正在进行单元测试项目,也可以从这些项目中获得映射配置 .
在Global.asax中,您将调用设置所有 Map 的方法 . 见下文:
文件AutoMapperBootStrapper.cs
应用程序启动时的Global.asax
只是打电话
现在有些人会反对这种方法违反一些SOLID原则,他们有一些有效的论据 . 在这里他们是为了阅读 .
Configuring Automapper in Bootstrapper violates Open-Closed Principle?
Update: 此处发布的方法不再有效,因为自AutoMapper v2起已删除
SelfProfiler
.我会采取与Thoai类似的方法 . 但我会使用内置的
SelfProfiler<>
类来处理 Map ,然后使用Mapper.SelfConfigure
函数进行初始化 .使用此对象作为源:
这些作为目的地:
您可以创建这些配置文件:
要在应用程序中初始化,请创建此类
将此行添加到您的global.asax.cs文件中:
AutoMapperConfiguration.Initialize()
现在,您可以将映射类放在对您有意义的位置,而不必担心单个映射类 .
对于那些坚持以下内容的人:
使用ioc容器
不喜欢为此打破封闭
不喜欢单片配置文件
我在配置文件和利用我的ioc容器之间进行了组合:
IoC配置:
配置示例:
用法示例:
权衡是您必须通过IMappingEngine接口而不是静态Mapper引用Mapper,但这是我可以使用的惯例 .
以上所有解决方案都提供了一种静态方法来调用(来自app_start或任何其他地方)它应该调用其他方法来配置映射配置的部分 . 但是,如果您有模块化应用程序,那些模块可能随时插入和退出应用程序,这些解决方案不起作用 . 我建议使用
WebActivator
库,可以注册一些方法在app_pre_start
和app_post_start
上运行,其中:您可以通过NuGet安装
WebActivator
.除了最好的答案,一个好方法是使用Autofac IoC liberary来添加一些自动化 . 有了这个,您 just 无论启动如何定义您的配置文件 .
并在
Application_Start
方法中调用此行:上面的代码找到所有 Profile 子类并自动启动它们 .
将所有映射逻辑放在一个位置对我来说不是一个好习惯 . 因为映射类非常大并且很难维护 .
我建议将映射内容与ViewModel类放在同一个cs文件中 . 您可以轻松导航到遵循此约定所需的映射定义 . 此外,在创建映射类时,您可以更快地引用ViewModel属性,因为它们位于同一文件中 .
所以你的视图模型类看起来喜欢:
从新版本的AutoMapper使用静态方法不推荐使用Mapper.Map() . 因此,您可以将MapperConfiguration作为静态属性添加到MvcApplication(Global.asax.cs)并使用它来创建Mapper的实例 .
App_Start
Global.asax.cs
BaseController.cs
https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API
对于使用AutoMapper的新版本(5.x)的vb.net程序员 .
Global.asax.vb:
AutoMapperConfiguration:
Profiles:
Mapping:
对于那些(丢失)使用的人:
WebAPI 2
SimpleInjector 3.1
AutoMapper 4.2.1(带配置文件)
以下是我在“new way”中集成AutoMapper的方法 . 一个 Huge 感谢answer(and question)
1 - 在WebAPI项目中创建名为“ProfileMappers”的文件夹 . 在这个文件夹中,我放置了我创建映射的所有配置文件类:
2 - 在我的App_Start中,我有一个SimpleInjectorApiInitializer来配置我的SimpleInjector容器:
3 - Startup.cs
4 - 然后,在你的控制器中只注入一个IMapper接口: