2016-07-27 3 views
0

Теперь, когда AutoMapper отменяет как статический API, так и возможность изменять сопоставления во время выполнения, у меня проблема с моим приложением WebForms без менеджера IoC.Auto Mapper 5, no Ioc и Webforms

Для этого вопроса принять как указано Я не могу ввести менеджера IoC в это приложение, и, хотя это будет «хорошо делать», приложение работает отлично без него в течение ряда лет, и в настоящий момент это невозможно сделать. Возможно, в будущем, но не сейчас.

С помощью AutoMapper, что я раньше делал, был метод в каждом классе, который я создал, который был вызван автоматически конструктором. В этом методе у меня были бы необходимые:

Mapper.CreateMap<>() 

звонки. Это имеет следующие преимущества:

  • Я только сопоставляюсь, что мне нужен для каждого запроса (и в зависимости от выполнения программы этого список отображений будет расти на то, что мне было нужно)
  • Всех типов были «местными» - смысл я не нужно ссылаться на другие проекты в решении

Я был счастлив жить с производительностью, поразив каждый запрос делать что-то таким образом, вместо того чтобы делать это один раз в Application_Start().

Однако с AutoMapper 5 ... Начитавшись migrating from the static API кажется, что я теперь должен:

  1. ли все отображения «где-то», где у меня есть доступ к все типы, которые я хочу, чтобы отобразить. Поэтому, независимо от того, где я это делаю, мне приходится ссылаться на каждую другую сборку в моем решении?
  2. После хранится экземпляр MapperConfiguration() где-то глобально доступным - позволяет говорить либо HttpContext или HttpApplication, так что я могу назвать MapperConfiguration.CreateMapper() теперь мне нужно, чтобы убедиться, что у меня есть доступ к HttpContext/HttpApplication везде. В конечном итоге это означает проекты, которые не требуют, чтобы HttpContext теперь должен был получить к нему доступ.

Если мои предположения в 1. & 2. выше правильные Я теперь имею большой беспорядок тесно связанного кода спагетти.

Так что мой вопрос заключается в следующем:

Как использовать AutoMapper 5 в приложении WebForms с многочисленными проектами (и, следовательно, много типов) в растворе, без IoC элегантно?

ответ

5

AutoMapper не отменяет статический API. Только части, которые изменяют конфигурацию по своему усмотрению. Оказывается, что разрешение Mapper.CreateMap в любой момент заставляет меня делать отображение sloooooooow.

Эта страница wiki Я забыл удалить. Вот фактическое руководство:

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.

+0

Я понимаю необходимость изменений и охватываю их для улучшения скорости, стабильной стабильности и т. Д. Однако «.... ставьте их в инициализацию» - в моей ситуации (без IoC) означает поместить его в Global.asax - Application_Start и ссылаться на каждую сборку в моем основном веб-приложении? Другого пути я не вижу. И затем, кроме того, теперь у меня должен быть глобальный, к которому я могу получить доступ в любой другой сборке? Я просто хочу убедиться, что я не пропустил что-то действительно очевидное здесь. Понятно, что я буду делать некоторые неприятные запахи кода при этом. – TheEdge

+0

Да, хотя я не вижу проблемы со ссылкой на каждую сборку в вашем основном веб-приложении. Если вы не строите какой-то подключаемый портал, это не должно быть проблемой. Однако большинство людей создают классы Profile в своих дочерних сборках и размещают там конфигурацию. Затем вызов Mapper.Initialize просто добавляет все эти профили вручную или через отражение для сканирования всех профилей. –

+0

Кроме того, я не уверен, что код пахнет, о котором вы говорите? Это очень рекомендуемый способ настройки AutoMapper. –