Nano Hash - криптовалюты, майнинг, программирование

Castle Windsor IoC Property Injection простое руководство

Хорошо, я думаю, что информации о замке Виндзор может быть слишком много, потому что поиск этих ключевых слов дает мне примеры всего, и, честно говоря, я недостаточно понимаю, как это работает, чтобы правильно устранять неполадки. Я пробовал довольно много перестановок с небольшой удачей на этом этапе.

У меня есть IUnitOfWorkFactory, который я хочу создать как синглтон. Итак, я устанавливаю Castle Windsor, пишу такой код:

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; }
    ...

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

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

я тоже пробовал

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 проблем...


  • Вы зарегистрировали свой контроллер? 16.03.2013
  • ... Разве это не было бы необходимо только для внедрения зависимостей конструктора? Возможно, я неправильно понимаю, как это должно работать. 16.03.2013
  • Нет, контейнер должен создать корень графа объектов. В данном случае контроллер. Это относится к внедрению свойства или конструктора (поскольку они работают одинаково). 16.03.2013
  • Если вы посмотрите на пример Windsor на сайте, первое, что он делает, это разрешает корневой объект container.Resolve<IKing>() — это то, что запускает процесс (docs.castleproject.org/) 16.03.2013
  • Хм... Я думал, что это шаблон локатора сервисов. Я посмотрю на это. 16.03.2013
  • Вы можете безопасно удалить последнюю строку propInjector.Resolve<IUnitOfWorkFactory>();, так как она ничего не делает. 15.10.2015

Ответы:


1

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

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

15.03.2013
  • На самом деле это было первоначальное руководство, с которого я начал, и у меня уже была построена эта фабрика контроллеров... но, похоже, это ничего не дает. У меня тоже есть установщик ... все еще ничего. 16.03.2013
  • Хорошо, это и комментарий Чарлеха заставили меня понять, что я делаю неправильно. Я напишу это в своем вопросе. Спасибо! 16.03.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..