Могу или должен я условно связать интерфейсы во время выполнения с Castle Windsor?

Я мог бы описать это неправильно, но вот моя дилемма, у меня есть ряд интерфейсов, таких как IBreadcrumbRetriever. Их реализации радикально различаются в зависимости от того, где они находятся на моем сайте, что я использую HttpContext.Current.Request.Path для определения.

Итак, внутри моего конкретного класса у меня сейчас есть несколько операторов if, которые определяют, какие элементы возвращать (для простоты, скажем List<string>). Для меня это запах кода.

Чего я действительно хотел бы, так это как-то, и я чувствую, что IoC и Castle Windsor могут мне здесь помочь, это определить, соответствует ли пользователь, попадающий на страницу, соответствует определенному условию, и привязать к нему правильный контейнер. Так что у меня было бы что-то вроде

if (HttpContext.Current.Request.Path == some condition)
     IBreadcrumbRetriever is ImplementedBy IsInProductAreaRetriever

Это хорошая идея? Если да, то как мне это сделать? Или я создаю как фабричный класс хлебных крошек и использую расширение «.DependsOn(HttpContext.Current.Request.Path)» для достижения того, что я делаю?


person chum of chance    schedule 19.06.2013    source источник


Ответы (1)


Это зависит от того, подходит ли архитектура вашего приложения для внедрения зависимостей.

Не знаком с Castle Windsor, но, вообще говоря, если зависимость не может быть разрешена в корне композиции (при запуске приложения), я не вижу ничего плохого во внедрении фабричной реализации, которая работает с текущим контекстом http.

Например, в приложении ASP.NET корень вашей композиции будет находиться в global.asax. Там вы можете привязать IBreadcrumbRetrieverFactory к реализации BreadcrumbRetrieverFactory. new добавление классов, которые не являются частью основной структуры (и некоторых из них), как правило, является признаком упущенной возможности DI (и тесной связи).

Контейнеры IoC и DI не являются серебряной пулей: внедрение зависимостей - это просто шаблон проектирования (подумайте о внедрении конструктора, конструкторы, которые назначают только private readonly полей - зависимости типа), а контейнеры IoC (все они) - не что иное, как инструменты для облегчения подключение зависимостей к конкретным реализациям. Имея это в виду, Castle Windsor не сделает ничего такого, чего нельзя было бы достичь с помощью DI для бедняков: главное - как можно раньше запустить создание экземпляров зависимостей, а именно при запуске приложения. , корень композиции.

Когда зависимость является «динамической», например, когда есть логика, которая определяет, должна ли реализация ISmurf быть HappySmurf или GrumpySmurf, лучше всего, IMHO, ввести зависимость ISmurfFactory вместо ISmurf и подтолкнуть фабрику разводка до корня состава.

person Mathieu Guindon    schedule 19.06.2013