Теперь, когда AutoMapper отменяет как статический API, так и возможность изменять сопоставления во время выполнения, у меня проблема с моим приложением WebForms без менеджера IoC.Auto Mapper 5, no Ioc и Webforms
Для этого вопроса принять как указано Я не могу ввести менеджера IoC в это приложение, и, хотя это будет «хорошо делать», приложение работает отлично без него в течение ряда лет, и в настоящий момент это невозможно сделать. Возможно, в будущем, но не сейчас.
С помощью AutoMapper, что я раньше делал, был метод в каждом классе, который я создал, который был вызван автоматически конструктором. В этом методе у меня были бы необходимые:
Mapper.CreateMap<>()
звонки. Это имеет следующие преимущества:
- Я только сопоставляюсь, что мне нужен для каждого запроса (и в зависимости от выполнения программы этого список отображений будет расти на то, что мне было нужно)
- Всех типов были «местными» - смысл я не нужно ссылаться на другие проекты в решении
Я был счастлив жить с производительностью, поразив каждый запрос делать что-то таким образом, вместо того чтобы делать это один раз в Application_Start().
Однако с AutoMapper 5 ... Начитавшись migrating from the static API кажется, что я теперь должен:
- ли все отображения «где-то», где у меня есть доступ к все типы, которые я хочу, чтобы отобразить. Поэтому, независимо от того, где я это делаю, мне приходится ссылаться на каждую другую сборку в моем решении?
- После хранится экземпляр MapperConfiguration() где-то глобально доступным - позволяет говорить либо HttpContext или HttpApplication, так что я могу назвать MapperConfiguration.CreateMapper() теперь мне нужно, чтобы убедиться, что у меня есть доступ к HttpContext/HttpApplication везде. В конечном итоге это означает проекты, которые не требуют, чтобы HttpContext теперь должен был получить к нему доступ.
Если мои предположения в 1. & 2. выше правильные Я теперь имею большой беспорядок тесно связанного кода спагетти.
Так что мой вопрос заключается в следующем:
Как использовать AutoMapper 5 в приложении WebForms с многочисленными проектами (и, следовательно, много типов) в растворе, без IoC элегантно?
Я понимаю необходимость изменений и охватываю их для улучшения скорости, стабильной стабильности и т. Д. Однако «.... ставьте их в инициализацию» - в моей ситуации (без IoC) означает поместить его в Global.asax - Application_Start и ссылаться на каждую сборку в моем основном веб-приложении? Другого пути я не вижу. И затем, кроме того, теперь у меня должен быть глобальный, к которому я могу получить доступ в любой другой сборке? Я просто хочу убедиться, что я не пропустил что-то действительно очевидное здесь. Понятно, что я буду делать некоторые неприятные запахи кода при этом. – TheEdge
Да, хотя я не вижу проблемы со ссылкой на каждую сборку в вашем основном веб-приложении. Если вы не строите какой-то подключаемый портал, это не должно быть проблемой. Однако большинство людей создают классы Profile в своих дочерних сборках и размещают там конфигурацию. Затем вызов Mapper.Initialize просто добавляет все эти профили вручную или через отражение для сканирования всех профилей. –
Кроме того, я не уверен, что код пахнет, о котором вы говорите? Это очень рекомендуемый способ настройки AutoMapper. –