如何在创建组件期间配置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();
    }));

如何在创建组件期间配置Castle Windsor错误处理

这是Windsor 2.5及更早版本中已知的限制。这种情况将在温莎3号快速失败。

在v3中还有一个新的事件EmptyCollectionResolving,当一个组件依赖于IFoo的集合,但没有IFoo的组件在容器中注册时引发。