Внедрение свойств замка Виндзор

#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:

  1. Убедитесь, что компонент, имеющий свойство IHandler, также зарегистрирован (и разрешен) в Windsor.
  2. Вы сказали, что это для 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));
 

Этот метод выполняет сопоставление на основе имени типа и имени интерфейса. Дополнительная информация Регистрация компонентов по соглашению