Конфигурация AutoMapper сбрасывается при использовании ASP.MVC 3.0 - PullRequest
0 голосов
/ 07 октября 2011

В этом сценарии я использую библиотеку AutoMapper в ASP.MVC 3.0 для обработки отображения между объектами dto и модели.Я попытался разместить весь код конфигурации AutoMapper в одном месте, поэтому он имеет следующую структуру:

protected void Application_Start()
{
    ConfigureAutoMapper();
    AreaRegistration.RegisterAllAreas();
    SetupWindsorContainer();
    RegisterRoutes(RouteTable.Routes);
}

...

private void ConfigureAutoMapper()
{
    Mapper.CreateMap<SampleDto, SampleModel>();
    ...
}

Этот код находится в классе MvcApplication.С помощью отладчика я проверил, что этот код выполняется, но когда я пытаюсь выполнить Mapper.Map<> в коде контроллера, я получаю исключение, сообщающее, что отображение не было зарегистрировано.Я подозревал, что это связано с тем, как ASP.MVC обрабатывает AppDomains, но, похоже, это то же самое AppDomain в обоих методах (регистрационный код и код отображения).ASAIR этот код выполняется правильно на ASP.MVC 2.0

EDIT 1: в соответствии с документацией MS для Application_Start:

"Вызывается, когда первый ресурс (например, страница) взапрашивается приложение ASP.NET. Метод Application_Start вызывается только один раз в течение жизненного цикла приложения. Этот метод можно использовать для выполнения задач запуска, таких как загрузка данных в кэш и инициализация статических значений.

При запуске приложения следует задавать только статические данные. Не устанавливайте никакие данные экземпляра, поскольку они будут доступны только первому экземпляру создаваемого класса HttpApplication. "

Конфигурация AutoMapper является статическим классомпоэтому я думаю, что он должен работать правильно при инициализации в Application_Start, но это не так.

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Я бы посоветовал вам установить WebActivator пакет NuGet и настроить его с помощью AutoMapper. Это гарантирует выполнение при запуске, и вы можете извлечь свой установочный код в отдельный класс и не загрязнять Global.asax. Более того, вы можете хранить свой код AutoMapper в отдельной dll (т. Е. В слое Service), и WebActivator все равно будет запускать ваш код, не изменяя ваш проект MVC вообще!

0 голосов
/ 07 октября 2011

События жизненного цикла и файл Global.asax

Методы Application_Start и Application_End - это специальные методы, которые не представляют события HttpApplication.ASP.NET вызывает их один раз за время существования домена приложения, а не для каждого экземпляра HttpApplication.

Вместо этого вы можете использовать Application_BeginRequest, хотя ответ Якуба звучит как хороший подход!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...