Я согласен с @DarinDimitrov, что MVP - интересный вариант. Однако при работе с устаревшим приложением перезапись существующей страницы в шаблон MVP является адской работой. В этом случае может быть лучше начать с шаблона Service Locator (но только в ваших классах пользовательского интерфейса), как вы уже делаете. Тем не менее, изменить одну вещь. Не открывайте выбранный контейнер DI для приложения, как я ожидаю, что вы делаете со свойством Global.IoC
.
Вместо этого создайте статический метод Resolve<T>
в классе Global
. Это полностью скрывает контейнер и позволяет вам менять реализации без необходимости что-либо менять на своих веб-страницах. Когда вы делаете это, использование Common Locator не дает никаких преимуществ, как предлагает @Wiktor. Common Service Locator - это просто еще одна абстракция для того, что не нужно абстрагировать (поскольку вы уже абстрагировали контейнер, используя Global.Resolve<T>
).
К сожалению, с веб-формами, на самом деле нет хорошего способа сделать это. Для Simple Injector я написал руководство по интеграции для веб-форм , в котором в основном описано использование метода Global.Resolve<T>
, но также показан способ проверки возможности создания классов Page. Руководство можно использовать и для других контейнеров DI.
Кстати, имейте в виду, что в Castle Windsor все, что вы запрашиваете, должно быть освобождено явным образом (шаблон Register Resolve Release *1019*). Это немного неприятно (IMO) и отличается от того, как работают другие контейнеры, и может быть источником утечек памяти, если вы делаете это неправильно.
Последнее примечание. Возможно внедрение конструктора с помощью веб-форм . Ну ... вроде, так как это вызовет перегруженный конструктор с использованием отражения после того, как Form
был создан с использованием конструктора по умолчанию, поэтому это вызывает Temporal Coupling .