Сейчас я внедряю инфраструктуру Injection Dependency в существующее приложение WebForms (используя Castle Windsor).
У меня довольно глубокий опыт работы с DI, и я очень сильно рекомендую впрыск конструктора над инъекцией сеттера. Если вы знакомы с Webforms, вы знаете, что инфраструктура ASP.Net обрабатывает конструкцию страниц и объектов управления, что делает невозможным истинное вложение конструктора.
Мое текущее решение - зарегистрировать контейнер в событии Application_Start для Global.asax и сохранить контейнер как общедоступную статическую переменную в Global. Затем я просто разрешаю каждую услугу, которая мне нужна непосредственно на странице, или управление, когда она мне нужна. Поэтому в верхней части каждой страницы я получаю код следующим образом:
private readonly IMyService _exposureManager = Global.IoC.Resolve<IMyService>();
private readonly IMyOtherService _tenCustomersExposureManager = Global.IoC.Resolve<IMyOtherService>();
Очевидно, мне не нравится, что все эти ссылки на контейнер, разбросанные по моему приложению, или мои зависимости на странице/контроле не явные, но я не смог найти лучший способ.
Есть ли более элегантное решение для использования DI с Webforms?