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

У меня есть 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, которую не удалось разрешить. Убедитесь, что зависимость правильно зарегистрирована в контейнере как служба или предоставлена ​​как встроенный аргумент.

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

Мысли?


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


Ответы (2)


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

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

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

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

person Cel    schedule 05.05.2012
comment
@ShaneCourtrille: это грязный взлом, и его нельзя помечать как ответ. Правильный ответ - другой. - person v.karbovnichy; 15.06.2016

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

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

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

person Dorian Farrimond    schedule 06.05.2015
comment
Вы, сэр, только что спасли мой рассудок. Пожалуйста +1. - person Immortal Blue; 09.08.2015