在这种情况下,我在ASP.MVC 3.0中使用AutoMapper
库来处理dto和模型对象之间的映射。我试图将所有AutoMapper配置代码放在一个地方,因此它具有以下结构:
protected void Application_Start()
{
ConfigureAutoMapper();
AreaRegistration.RegisterAllAreas();
SetupWindsorContainer();
RegisterRoutes(RouteTable.Routes);
}
...
private void ConfigureAutoMapper()
{
Mapper.CreateMap<SampleDto, SampleModel>();
...
}
此代码放在MvcApplication
类中。使用调试器我检查了这段代码是否被执行但是当我尝试在Controller代码中执行Mapper.Map<>
时,我得到了一个例外,说明映射尚未注册。我怀疑这与ASP.MVC处理AppDomains
的方式有关,但在两种方法(注册码和映射代码)中似乎都是相同的AppDomain
。 ASAIR此代码在ASP.MVC 2.0上正确执行
编辑1: 根据{{1}}上的MS文档:
“在ASP.NET中的第一个资源(例如页面)时调用 请求申请。仅调用Application_Start方法 在应用程序的生命周期中的一次。你可以用它 执行启动任务的方法,例如将数据加载到缓存中 并初始化静态值。
您应该在应用程序启动期间仅设置静态数据。不要设置 任何实例数据,因为它只能用于第一个 创建的HttpApplication类的实例。“
AutoMapper配置是静态类,因此我认为它在Application_Start
中初始化时应该可以正常工作,但事实并非如此。
答案 0 :(得分:3)
我建议您安装 WebActivator NuGet包并使用它设置AutoMapper。它保证在启动时执行,您可以将设置代码提取到单独的类中,而不会污染Global.asax。更重要的是,您可以将AutoMapper代码保存在一个单独的dll中(即,在服务层中),WebActivator仍然可以运行您的代码而无需修改您的MVC项目!
答案 1 :(得分:0)
Life Cycle Events and the Global.asax file
Application_Start和Application_End方法是不代表HttpApplication事件的特殊方法。 ASP.NET在应用程序域的生命周期内调用它们一次,而不是为每个HttpApplication实例调用它们。
您可以使用Application_BeginRequest
代替,但Jakub的答案听起来不错!