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