使用ASP.MVC 3.0时,AutoMapper配置会重置

时间:2011-10-07 10:46:01

标签: .net asp.net-mvc automapper

在这种情况下,我在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中初始化时应该可以正常工作,但事实并非如此。

2 个答案:

答案 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的答案听起来不错!