Auto Mapper 5, без Ioc и Webforms
Теперь, когда AutoMapper отменяет как статический API, так и возможность изменять сопоставления во время выполнения, у меня возникла проблема с моим приложением WebForms без менеджера IoC.
Ради этого вопроса примите как данность, я не могу ввести менеджера IoC в это приложение, и хотя было бы "хорошо сделать", приложение работало без него в течение ряда лет, и это не может быть сделано правильно в момент В будущем возможно, но не сейчас.
С AutoMapper у меня было то, что раньше у меня был метод в каждом классе, который был создан экземпляром и который автоматически вызывался конструктором. В этом методе у меня было бы необходимое:
Mapper.CreateMap<>()
звонки. Это имеет следующие преимущества:
- Я отображал только то, что мне нужно для каждого запроса (и в зависимости от потока программы этот список отображений будет расти до того, что мне нужно)
- Все типы были "локальными", то есть мне не нужно было ссылаться на другие проекты в решении.
Я был счастлив жить с производительностью, поражающей каждый запрос на выполнение таких действий вместо того, чтобы делать это один раз в Application_Start().
Однако с AutoMapper 5... Прочитав миграцию из статического API, кажется, что теперь мне нужно:
- Сделайте все сопоставления где-нибудь, где у меня есть доступ ко всем типам, которые я хочу отобразить. Поэтому независимо от того, где я это разместил, я должен ссылаться на каждую другую сборку в своем решении?
- Храня экземпляр MapperConfiguration() где-нибудь в глобальном масштабе - скажем, HttpContext или HttpApplication, чтобы я мог вызвать MapperConfiguration.CreateMapper(). Теперь мне нужно убедиться, что у меня есть доступ к HttpContext / HttpApplication везде. В конечном итоге это означает, что проектам, которые не нуждаются, скажем, HttpContext теперь потребуется доступ к нему.
Если мои предположения в пунктах 1. и 2. выше верны, у меня теперь большой беспорядок в тесно связанном коде спагетти.
Итак, мой вопрос заключается в следующем:
Как использовать AutoMapper 5 в приложении веб-форм с многочисленными проектами (и, следовательно, множеством типов) в решении, без элегантного IoC?
1 ответ
AutoMapper не отменяет статический API. Только части, которые изменяют конфигурацию по желанию. Оказывается, что разрешение Mapper.CreateMap в любое время вынуждает меня сделать отображение sloooooooow.
Эту вики-страницу я забыл удалить. Вот фактическое руководство:
https://github.com/AutoMapper/AutoMapper/wiki/Static-and-Instance-API
И 5.0 руководство по обновлению:
https://github.com/AutoMapper/AutoMapper/wiki/5.0-Upgrade-Guide
Общая история такова: "избавьтесь от вызовов Mapper.CreateMap, разбросанных повсюду, и поместите их в инициализацию". Вы можете использовать профили, чтобы помочь вам.
Но Mapper.CreateMap, разбросанный по всему вашему приложению, был ВСЕГДА опасным. Это означало, что вы не можете использовать Mapper.AssertConfigurationIsValid, что очень опасно пропускать. Если вы не можете утверждать проверку конфигурации, вы не должны использовать AutoMapper.