Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Не удается передать параметр в фабрику Windsor Typed Factory.

Автор вопроса: Shane CourtrilleОтветов: 2

У меня есть IRunningTaskFactory, которая зарегистрирована в Windsor AsFactory() с использованием Typed Factory Facility. Интерфейс имеет единственный метод, который выглядит так:

RunningTask Create(ITask task);

Где RunningTask зарегистрирован в Windsor как временный, имеет конструктор:

public RunningTask(ITask task, ITaskConfigurationFactory taskConfigurationFactory)

где ITaskConfigurationFactory также зарегистрирован в Windsor.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю метод Create и передаю ITask, я получаю следующую ошибку:

Castle.MicroKernel.Resolvers.DependencyResolverException: Отсутствует зависимость. Компонент Husky.nHuskyTasker.Core.Tasks.RunningTask имеет зависимость от Husky.nHuskyTasker.Core.Tasks.ITask, которую не удалось разрешить. Убедитесь, что зависимость правильно зарегистрирована в контейнере как служба или предоставлена ​​как встроенный аргумент.

Из того, что я прочитал в документации, это должно работать.

Мысли?

  • На данный момент я написал свой собственный RunningTaskFactory, который получает IKernel и вызывает его с предоставленной задачей, и это отлично работает. Согласно документам, я не делаю ничего такого, чего Фабрика не должна делать сама. Shane Courtrille 24.03.2011
  • Я думаю, вам все равно нужно будет явно зарегистрировать компонент для ITask... Mark Seemann 24.03.2011
  • Я не могу. Существует N реализаций ITask, и я не хочу, чтобы они имели доступ к моему контейнеру. Shane Courtrille 24.03.2011
  • Им не нужно иметь доступ к контейнеру (они не должны), но контейнер должен иметь доступ к ним/знать о них. Mark Seemann 24.03.2011
  • если они зарегистрированы на сервере, они имеют доступ к серверу, добавив ядро ​​​​IKernel в свой конструктор. Shane Courtrille 24.03.2011
  • Вы проверили, что задача не нулевая? И может ли быть несоответствие ITask (возможно от Microsoft.Build.Framework) Marwijn 06.05.2015

dependency-injectioncastle-windsor

Ответы

Ответ 1 · рейтинг 1 · Cel

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

Component.For<ITask>().ImplementedBy<AnEmptyTask>()

Но я согласен, это должно работать без фиктивной реализации и дополнительной регистрации.

Обратите внимание, что регистрация ITask будет иметь побочный эффект: Windsor автоматически связывает все общедоступные свойства, связанные с этим типом, которые вам может потребоваться подавить

Ответ 2 · рейтинг 7 · Dorian Farrimond

У меня была та же проблема (параметр времени выполнения в типизированную фабрику не разрешался), и это оказалось из-за того, что имя параметра на моей фабрике и имя параметра конструктора в фактическом классе были разными, поэтому при вызове .Create() на типизированная фабрика не смогла разрешить мой параметр.

Этот поток решен с помощью проблемы: Can Castle .Windsor TypedFactoryFacility создает тип только с некоторыми встроенными аргументами ref?

Не очевидно, но имеет смысл.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы