【问题标题】:AutoMapper configuration resets when using ASP.MVC 3.0使用 ASP.MVC 3.0 时 AutoMapper 配置重置
【发布时间】:2011-12-02 22:13:02
【问题描述】:

在这种情况下,我使用 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 类中。使用调试器,我检查了此代码是否已执行,但是当我尝试在控制器代码中执行 Mapper.Map&lt;&gt; 时,我收到异常说映射尚未注册。我曾怀疑这与 ASP.MVC 如何处理 AppDomains 有关,但在两种方法(注册代码和映射代码)中似乎是相同的 AppDomain。 ASAIR 此代码在 ASP.MVC 2.0 上正确执行

编辑 1: 根据Application_Start 上的 MS 文档:

"在 ASP.NET 中的第一个资源(例如页面)时调用 申请。仅调用 Application_Start 方法 在应用程序的生命周期中进行一次。你可以用这个 执行启动任务的方法,例如将数据加载到缓存中 并初始化静态值。

您应该在应用程序启动期间只设置静态数据。不要设置 任何实例数据,因为它只对第一个可用 创建的 HttpApplication 类的实例。”

AutoMapper 配置是静态类,所以我认为在 Application_Start 中初始化时它应该可以正常工作,但它没有。

【问题讨论】:

    标签: .net asp.net-mvc automapper


    【解决方案1】:

    我建议您安装 WebActivator NuGet 包并使用它设置您的 AutoMapper。它保证在启动时执行,您可以将设置代码提取到单独的类中,而不会污染 Global.asax。更重要的是,您可以将 AutoMapper 代码保存在单独的 dll 中(即,在服务层中),WebActivator 仍将运行您的代码,而无需修改您的 MVC 项目!

    【讨论】:

      【解决方案2】:

      Life Cycle Events and the Global.asax file

      Application_Start 和 Application_End 方法是不代表 HttpApplication 事件的特殊方法。 ASP.NET 在应用程序域的生命周期内调用它们一次,而不是为每个 HttpApplication 实例调用一次。

      您可以改用Application_BeginRequest,尽管 Jakub 的回答听起来确实不错!

      【讨论】:

      • 您不应该将 AutoMapper 配置放在 BeginRequest 中,因为不必在每个请求上重新创建配置(出于性能原因)
      • 我同意 - 只是指出它为什么不工作以及一个糟糕的解决方法。
      • 看看我的EDIT 1 笔记。我不同意无法从Application_Start 执行此代码,因为它足以为 AppDomain 调用一次。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      相关资源
      最近更新 更多