#dependency-injection #castle-windsor
#внедрение зависимостей #замок-Виндзор
Вопрос:
Я новичок в Виндзоре, и у меня возникли некоторые проблемы с внедрением зависимостей. я использую asp.net веб-приложение.
Я сделал следующее
public interface IHandler{
...
}
public class Handler : IHandler{
...
}
затем я пытаюсь зарегистрировать код в global.asax application_start
container.Register(Component
.For(typeof(IHandler))
.ImplementedBy(typeof(Handler))
.Named("handler"));
Когда я хочу использовать обработчик, я создаю свойство
public IHandler handler{get;set;}
но когда я пытаюсь его использовать, оно равно нулю? почему? я что-то упускаю?
С наилучшими пожеланиями
Обновить
Единственное, что я делаю для регистрации / разрешения, это следующее:
container.Register(Component
.For(typeof(IHandler))
.ImplementedBy(typeof(Handler))
.Named("handler"));
и:
container.Resolve<IHandler>();
Нужно ли мне делать что-то еще, работает ли это для запуска этого att-приложения?
ОБНОВЛЕНИЕ 2
Может ли проблема возникнуть из-за того, что я пытаюсь внедрить зависимость в элемент управления ascx?
Комментарии:
1. Прошло много времени, пока я делал веб-формы. Есть ли какой-либо способ управлять созданием экземпляра элемента управления ASCX? Или какие-либо перехваты, которые будут уведомлены после создания экземпляра, но до того, как он будет использоваться механизмом рендеринга? Вам нужно подключиться к одной из этих точек (создание экземпляра или после создания экземпляра), чтобы вы могли подключить к ней windsor.
Ответ №1:
- Убедитесь, что компонент, имеющий свойство IHandler, также зарегистрирован (и разрешен) в Windsor.
- Вы сказали, что это для ASP.NET применение. Стиль жизни компонентов Windsor по умолчанию — одноэлементный. Вы уверены, что хотите, чтобы этот компонент был таким общим? Для этого компонента может потребоваться переходный режим или режим для каждого веб-запроса.
Комментарии:
1. Привет, я пробовал использовать контейнер. Регистр (компонент . Для (typeof(IHandler)) .Реализовано с помощью (typeof(обработчик)) .Named(«обработчик»)); для регистрации и
2. Нет, извините, я не понял. Компонент, имеющий зависимость IHandler, должен находиться в Windsor. Вы никогда не захотите вызывать container.Resolve<> самостоятельно. Вы регистрируете свои компоненты и службы в контейнере, и зависимости будут автоматически разрешены Windsor при создании вашего компонента / службы.
3. Вы должны вызвать Resolve<> один раз, чтобы получить верхний объект вашего объектного графика. Однако вы никогда не должны вызывать его более одного раза
Ответ №2:
Попробуйте удалить имя из регистрации, например:
container.Register(Component
.For(typeof(IHandler))
.ImplementedBy(typeof(Handler)));
В качестве альтернативы, если необходимо присвоить компоненту имя, его можно использовать ServiceOverrides
для класса-потребителя:
container.Register(Component
.For<SomeConsuer>()
.ServiceOverrides(new { handler = "handler" }));
Ответ №3:
Если вы собираетесь регистрировать несколько интерфейсов / сервисов, я рекомендую регистрироваться по соглашению (это рекомендуется в документах). Рассмотрим это:
container.Register(
AllTypes.FromAssemblyNamed("Assembly")
.Where(Component.IsInNamespace("Assembly.Namespace"))
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.Transient));
Этот метод выполняет сопоставление на основе имени типа и имени интерфейса. Дополнительная информация Регистрация компонентов по соглашению