2011-10-07 52 views
0

在这种情况下,我在ASP.MVC 3.0中使用AutoMapper库来处理dto和模型对象之间的映射。我试图将所有AutoMapper配置码在一个地方,因此它具有以下结构:AutoMapper配置在使用ASP.MVC 3.0时重置

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

EDIT 1正确执行:上Application_Start 根据MS文档:

“时调用在ASP.NET 应用所述第一资源(例如,页)被请求。Application_Start方法中的一个应用程序的生命周期中只能调用 一次。您可以使用此方法 执行启动任务,如将数据加载到高速缓存 和初始化静态值。

你应该在应用程序启动时只设置静态数据。不要设置 任何实例数据,因为这将是仅适用于创建的HttpApplication类的第一个 实例。”

AutoMapper配置是静态类,所以我觉得在Application_Start初始化时,它应能正常工作,但事实并非如此。

回答

3

我建议你安装WebActivator NuGet包,并用它设置您的AutoMapper。它保证了在启动时执行,你可以提取您的设置代码以一个单独的类,不污染全球。 asax。更重要的是,你可以保持你的AutoMapper代码在一个单独的DLL(即,在一个服务层),WebActivator仍然会运行你的代码而不修改你的MVC项目!

0

Life Cycle Events and the Global.asax file

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

你可以使用Application_BeginRequest来代替,尽管Jakub的回答听起来像是一个很好的方法!

+0

你不应该把你的AutoMapper配置放在'BeginRequest'中,因为不需要在每个请求上重新创建配置(出于性能的原因) –

+0

我同意 - 只是指出它为什么不起作用,而穷人解决方法。 – Cymen

+0

看看我的'编辑1'笔记。我不同意这个代码不能从'Application_Start'执行,因为它足够为AppDomain调用一次。 – jethro