6

OK Я думаю, что может быть слишком много информация о Castle Windsor, потому что поиск этих ключевых слов дает мне примеры всего, и, честно говоря, я недостаточно понимаю, как это работает правильно устраните это. На данный момент я попробовал немало перестановок.Замок Windsor IoC Property Injection прост в использовании

У меня есть IUnitOfWorkFactory, который я хочу создать как одноэлементный. Таким образом, установить замок Виндзор, написать немного кода, как так:

iocContainer = new WindsorContainer() 
    .Install(FromAssembly.This()); 

var propInjector = iocContainer.Register(
    Component.For<IUnitOfWorkFactory>() 
    .LifestyleSingleton() 
    .Instance(new NHUnitOfWorkFactory()) 
    ); 

propInjector.Resolve<IUnitOfWorkFactory>(); 

Это вызывается из моего Application_Start метода.

У меня есть AccountController проводную до примерно так:

public class AccountController : SecureController 
{ 
    public IUnitOfWorkFactory UnitOfWorkFactory { get; set; } 
    ... 

... насколько я могу понять, это надо просто «работа» (хотя не спрашивайте меня как). Но мое свойство всегда имеет значение null, когда я пытаюсь его использовать.

Кажется, что мне не хватает чего-то глупого и простого, но я понятия не имею, что это такое.

Я также попытался

var propInjector = iocContainer.Register(
    Component.For<IUnitOfWorkFactory>() 
    .ImplementedBy<NHUnitOfWorkFactory>() 
    .LifestyleSingleton() 
    ); 

без успеха.

Что я делаю неправильно?

ЗАКЛЮЧЕНИЕ

я пропускал несколько шагов здесь. Я построил установщик и загрузчик по tutorial, но я зарегистрировал свои услуги не в том месте ... до создания фабрики контроллеров. Теперь мой Загрузчик выглядит следующим образом:

iocContainer = new WindsorContainer() 
    .Install(FromAssembly.This()); 

var controllerFactory = new WindsorControllerFactory(iocContainer.Kernel); 
ControllerBuilder.Current.SetControllerFactory(controllerFactory); 

iocContainer.Register(
    Component.For<IUnitOfWorkFactory>() 
    .ImplementedBy<NHUnitOfWorkFactory>() 
    .LifestyleSingleton() 
    ); 

... и мои инъекции собственности уже не пустые .... теперь я просто отлаживать другие проблемы ... 87

+0

Вы зарегистрированы как ваш контроллер? –

+0

... Не было бы это необходимо только для инъекции зависимостей конструктора? Возможно, я неправильно понимаю, как это должно работать. –

+0

Нет, контейнер должен создать корень графа объекта. В этом случае контроллер. Это относится к инъекции свойств или конструктора (потому что они работают одинаково). –

ответ

6

Оба конструктор и недвижимость инъекции, когда объект корня разрешается контейнером. В этом случае ваш AccountController будет корневым объектом, который необходимо создать Виндзору.

Чтобы подключить это устройство, вы должны использовать controller factory. Как только контроллер зарегистрирован и разрешен контейнером, все должно работать так, как вы ожидаете.

+0

На самом деле это было первоначально учебное пособие, с которого я начал работать, и у меня уже был построен этот контроллер, но это ничего не делает.У меня тоже есть установщик ... все равно ничего. –

+0

Хорошо, это и комментарий Шарлеса привели меня к тому, что я делал неправильно. Я напишу это в своем вопросе. Благодаря! –

Смежные вопросы