Замок Виндзор собственности инъекция - PullRequest
3 голосов
/ 25 октября 2011

Я виндзорский новичок, и у меня возникли некоторые проблемы, заставляющие работать инъекцию зависимостей. я использую веб-приложение 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;}

но когда я пытаюсь его использовать, он становится пустым? Зачем? мне не хватает чего-то?

С наилучшими пожеланиями

UPDATE

Единственное, что я делаю, регистрируюсь / разрешаю следующее:

container.Register(Component
    .For(typeof(IHandler))
    .ImplementedBy(typeof(Handler))
    .Named("handler"));

и

container.Resolve<IHandler>();

Нужно ли делать что-то еще? Работает ли это для запуска этого приложения att?

ОБНОВЛЕНИЕ 2

Может ли проблема возникнуть из-за того, что я пытаюсь внедрить зависимости на контроллере ascx?

Ответы [ 3 ]

4 голосов
/ 25 октября 2011
  1. Убедитесь, что компонент, имеющий свойство IHandler, также зарегистрирован (и разрешен) в Виндзоре.

  2. Вы сказали, что это для приложения ASP.NET,Стиль жизни компонентов Windsor по умолчанию - синглтон.Вы уверены, что хотите, чтобы этот компонент был таким же?Для этого компонента может потребоваться временный или веб-запрос стиля жизни.

1 голос
/ 25 октября 2011

Если вы собираетесь регистрировать несколько интерфейсов / сервисов, то я рекомендую зарегистрироваться по соглашению (это рекомендуется в документации).Учтите это:

container.Register(
            AllTypes.FromAssemblyNamed("Assembly")
                .Where(Component.IsInNamespace("Assembly.Namespace"))
                .WithService.DefaultInterface()
                .Configure(c => c.LifeStyle.Transient));

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

1 голос
/ 25 октября 2011

Попробуйте удалить имя из регистрации, например:

container.Register(Component
    .For(typeof(IHandler))
    .ImplementedBy(typeof(Handler)));

В качестве альтернативы, если вы должны назвать компонент, вы можете использовать ServiceOverrides для класса потребления:

container.Register(Component
    .For<SomeConsuer>()
    .ServiceOverrides(new { handler = "handler" }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...