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

时间:2011-11-18 20:16:35

标签: c# castle-windsor castle

我有一个在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();
    }));

1 个答案:

答案 0 :(得分:3)

这是Windsor 2.5及更早版本中的已知限制。这种情况在Windsor 3中会失败。

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