如何在创建组件期间配置Castle Windsor错误处理
本文关键字:Castle 配置 Windsor 错误 处理 创建 创建组 组件 | 更新日期: 2023-09-27 18:15:04
我有一个在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>();
我如何处理这个错误并关闭一切?我本以为内核上会有一个事件,但似乎没有。
我的解决办法:
我为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();
}));
这是Windsor 2.5及更早版本中已知的限制。这种情况将在温莎3号快速失败。
在v3中还有一个新的事件EmptyCollectionResolving
,当一个组件依赖于IFoo
的集合,但没有IFoo
的组件在容器中注册时引发。