从非泛型接口解析通用类型的具体类时的异常

时间:2013-06-17 22:48:47

标签: c# inversion-of-control castle-windsor ioc-container

上下文

我有一个非泛型接口,IInputEventProvider由具体类InputEventProvider<TState, TInputEvent>实现。

在我的安装程序中,我使用不同的泛型类型参数注册具体类型四次,如下所示:

.Register(
    Component.For<IInputEventProvider>()
        .ImplementedBy<InputEventProvider<KeyboardState, KeyboardEvent>>(),
    Component.For<IInputEventProvider>()
        .ImplementedBy<InputEventProvider<MouseState, MouseButtonEvent>>(),
    Component.For<IInputEventProvider>()
        .ImplementedBy<InputEventProvider<MouseState, MouseMoveEvent>>(),
    Component.For<IInputEventProvider>()
        .ImplementedBy<InputEventProvider<MouseState, ScrollWheelEvent>>()
)

我还根据接口对程序集中的所有类进行基于约定的注册:

.Register(
    Classes.FromAssemblyContaining<MainClass>()
        .Pick()
        .WithServiceAllInterfaces()
)

最后在我的一个类中,我依赖于IEnumerable<IInputEventProvider>,它应该返回我的四个注册类型实例。

问题

在我的作品根处解析时,我得到以下异常:

  

请求类型Exuinoq.Core.Input.IInputEventProvider有0个泛型   参数(s),而组件实现类型   Exuinoq.Core.Input.InputEventProvider`2 [TState,TInputEvent]要求   2。

这是因为安装程序中基于约定的注册已经选择了通用的具体类并将其注册为泛型类型,然后无法解析。

问题

避免这种情况并避免将来发生在其他课程中的最佳方法是什么?该例外提供了以下建议:

  

您可以指示Windsor应该使用哪种类型来关闭它   通用组件提供的实现   IGenericImplementationMatchingStrategy。

但是,我认为这仅适用于您希望注册单个类型而不是四个不同类型的类型。我可能错了!

目前我已经使用过这种解决方法,但它几乎不可持续:

.Register(
    Classes.FromAssemblyContaining<MyClass>()
        .Where(t => !typeof(IInputEventProvider).IsAssignableFrom(t))
        .WithServiceAllInterfaces()
)

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用诸如[RegisterWith(Type t, Type t2)]之类的属性来标记所有这些具体类 - 但是建议将容器相关代码与其他所有代码保持一致,以便在可能的情况下我想避免使用它。我更喜欢这种解决方案而不是硬编码容器中不需要的类型 - 它比配置更常见。

相关问题