【问题标题】:Can't pass parameter to Windsor Typed Factory Facility无法将参数传递给 Windsor Typed Factory Facility
【发布时间】:2011-03-24 16:14:36
【问题描述】:

我有一个 IRunningTaskFactory,它使用 Typed Factory Facility 在 Windsor AsFactory() 中注册。该接口有一个方法,如下所示:

RunningTask Create(ITask task);

在 Windsor 中将 RunningTask 注册为瞬态的地方有一个构造函数:

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 并使用提供的任务调用它,并且工作正常。根据文档,我没有做任何工厂不应该做的事情..
  • 你仍然需要为 ITask 显式注册一个组件,我认为...
  • 我不能。 ITask 有 N 个实现,我不希望它们访问我的容器。
  • 他们不需要访问容器(他们不应该),但容器需要访问它们/了解它们。
  • 如果他们在服务器上注册,他们可以通过将 IKernel 内核添加到他们的构造函数来访问服务器。

标签: .net dependency-injection castle-windsor


【解决方案1】:

我遇到了同样的问题(运行时参数进入类型化工厂没有解析),原来是因为我工厂上的参数名称和实际类上的构造函数参数名称不同,所以在调用 .Create 时() 在类型化工厂上它无法解析我的参数。

此线程已通过问题解决: Can Castle.Windsor TypedFactoryFacility construct a type with only some ref arguments passed inline?

不明显,但有道理。

【讨论】:

  • 您,先生,刚刚挽救了我的理智。请+1。
【解决方案2】:

我发现,如果您为带有变量实例的类型指定一个虚拟注册,那么您的参数将被正确传递:

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

但我同意,this should work 无需进行模拟实现和额外注册。

请注意,注册 ITask 将产生 Windsor 自动关联任何涉及该类型的公共属性的副作用,您可能需要禁止该类型

【讨论】:

  • @ShaneCourtrille:这是一个肮脏的黑客,不得标记为答案。正确答案是另一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
相关资源
最近更新 更多