无法将参数传递给Windsor Typed Factory Facility。

7

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

RunningTask Create(ITask task);

当RunningTask在Windsor中注册为瞬时对象时,它有一个构造函数:

public RunningTask(ITask task, ITaskConfigurationFactory taskConfigurationFactory)

我遇到的问题是,当我调用Create方法并传递一个ITask时,会出现以下错误:

Castle.MicroKernel.Resolvers.DependencyResolverException:缺少依赖项。组件Husky.nHuskyTasker.Core.Tasks.RunningTask依赖于Husky.nHuskyTasker.Core.Tasks.ITask,但无法解析该依赖项。请确保将依赖项正确注册为服务,并提供为内联参数。

根据文档的说明,这应该能够正常工作。

有什么想法吗?

其中ITaskConfigurationFactory也已经在Windsor中注册了。


1
目前我已经编写了自己的RunningTaskFactory,它获取一个IKernel并使用提供的任务调用它,这很好地工作。根据文档,我没有做任何工厂本身不应该做的事情。 - Shane Courtrille
你仍然需要显式地为ITask注册一个组件,我想... - Mark Seemann
我不能这样做。ITask有N个实现,我不希望它们能够访问我的容器。 - Shane Courtrille
他们不需要访问容器(也不应该),但容器需要访问他们/知道他们的存在。 - Mark Seemann
如果他们已经在服务器上注册,他们可以通过将 IKernel 内核添加到构造函数中来访问服务器。 - Shane Courtrille
你检查过任务不是空的吗?还有可能会出现ITask(可能来自Microsoft.Build.Framework)不匹配的情况。 - Marwijn
2个回答

7

先生,你刚刚拯救了我的理智。请加上+1。 - Immortal Blue

1
我发现,如果您为具有可变实例的类型指定虚拟注册,则可以在没有错误的情况下传递参数:
Component.For<ITask>().ImplementedBy<AnEmptyTask>()

但我同意,这应该可以工作,而不必拥有那个模拟实现和额外的注册。

请注意,注册ITask将具有Windsor自动连接涉及该类型的任何公共属性的副作用,您可能需要抑制


@ShaneCourtrille:这是一个不好的hack,不能标记为答案。正确的答案是另一个。 - v.karbovnichy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接