我有一个在Castle Windsor注册的组件,它取决于组件列表,每个组件都由一个接口表示。 Castle Windsor的配置类似于下面的代码。
public class WindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
//Allow the container to resolve all IFooComponent
//as IEnumerable<IFooComponent>
container.Kernel.Resolver
.AddSubResolver(new CollectionResolver(container.Kernel, false));
container.Register(
Component
.For<IMainService>()
.ImplementedBy<AwesomeMainService>());
container.Register(
Component.For<IFooComponent>()
.ImplementedBy<CoolFooComponent>()
.Named(typeof (CoolFooComponent).Name),
Component.For<IFooComponent>()
.ImplementedBy<FooComponentWithUnresolvedDependancy>()
.Named(typeof (FooComponentWithUnresolvedDependancy).Name)
//....
);
}
}
AwesomeMainService
取决于IEnumerable<IFooComponent>
,如下所示
public class AwesomeMainService : IMainService
{
public AwesomeMainService(IEnumerable<IFooComponent> fooComponents)
{
//I could count the fooComponents here but this is a hack
}
}
现在,如果IFooComponent
中的一个缺少依赖项,或者Castle Windsor在实例化IFooComponent
时遇到异常,则Castle Windsor会捕获该异常而不会重新抛出异常。当我解析IMainService
的已注册实例时,一切都很正常,因为至少有一个IFooComponent
的实例可以创建。
//No exception here because there is at least 1 IFooComponent
var plugin = _container.Resolve<IMainService>();
如何处理此错误并关闭所有内容?我原本以为会有event on the Kernel,但似乎没有。
我的修复:
我为AwesomeMainService
创建了一个动态参数,该参数计算了IFooProcessor
已注册的数量。然后AwesomeMainService
验证了这与提供的IFooProcessor
的数量相匹配。
public class AwesomeMainService : IMainService
{
public AwesomeMainService(IEnumerable<IFooComponent> fooComponents,
int expectedProcessorCount)
{
Verify.That(fooComponents.Count == expectedProcessorCount,
"requestProcessors does not match the expected number " +
"of processors provided");
}
}
然后我将此添加到AwesomeMainService注册:
.DynamicParameters((kernel, parameters) =>
{
parameters["expectedProcessorCount"] =
container.Kernel.GetAssignableHandlers(typeof (object))
.Where(
h => h.ComponentModel.Service.UnderlyingSystemType ==
typeof (IRequestProcessor))
.Count();
}));
答案 0 :(得分:3)
这是Windsor 2.5及更早版本中的已知限制。这种情况在Windsor 3中会失败。
在v3中还有一个新事件EmptyCollectionResolving
,当一个组件依赖于IFoo
的集合但在容器中没有注册IFoo
的组件时引发它。