C# 从非泛型接口解析泛型类型的具体类时出现异常 上下文

C# 从非泛型接口解析泛型类型的具体类时出现异常 上下文,c#,inversion-of-control,castle-windsor,ioc-container,C#,Inversion Of Control,Castle Windsor,Ioc Container,我有一个非通用接口,IInputEventProvider,它由一个具体类,InputEventProvider实现 在我的安装程序中,我用不同的泛型类型参数注册了四次具体类型,如下所示: .Register( Component.For<IInputEventProvider>() .ImplementedBy<InputEventProvider<KeyboardState, KeyboardEvent>>(), Compo

我有一个非通用接口,
IInputEventProvider
,它由一个具体类,
InputEventProvider
实现

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

.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>>()
)
。寄存器(
用于()的组件
.ImplementedBy(),
用于()的组件
.ImplementedBy(),
用于()的组件
.ImplementedBy(),
用于()的组件
.由()实施
)
我还根据接口对程序集中的所有类进行基于约定的注册:

.Register(
    Classes.FromAssemblyContaining<MainClass>()
        .Pick()
        .WithServiceAllInterfaces()
)
。寄存器(
类。FromAssemblyContaining()
.Pick()
.WithServiceAllInterfaces()
)
最后,在我的一个类中,我获得了对
IEnumerable
的依赖,它应该返回我的四个注册类型实例

问题 在合成根目录下解析时,出现以下异常:

请求的类型Exuinoq.Core.Input.IInputEventProvider具有0个泛型 参数,而组件实现类型 Exuinoq.Core.Input.InputEventProvider`2[TState,TInputEvent]需要 二,

这是因为安装程序中基于约定的注册已获取泛型混凝土类并将其注册为泛型类型,因此无法解析

问题 避免这种情况并防止将来发生在其他类上的最佳方法是什么?异常给出了以下建议:

您可以指示Windsor应使用哪种类型来关闭此窗口 通过提供 iGeneric实施匹配策略

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

目前,我已经使用了这种变通方法,但它很难持续:

.Register(
    Classes.FromAssemblyContaining<MyClass>()
        .Where(t => !typeof(IInputEventProvider).IsAssignableFrom(t))
        .WithServiceAllInterfaces()
)
。寄存器(
类。FromAssemblyContaining()
.Where(t=>!typeof(IInputEventProvider).IsAssignableFrom(t))
.WithServiceAllInterfaces()
)

一种解决方案是使用属性标记所有此类具体类,例如
[RegisterWith(Type t,Type t2)]
——但是建议将与容器相关的代码与其他所有内容分开,因此如果可能的话,我希望避免这样做。与在容器中硬编码不需要的类型相比,我更喜欢这种解决方案——它更符合惯例而不是配置。

例外情况不是关于四个显式注册的组件。您的其他注册很可能再次选择该类作为开放泛型。您可以通过查看所有服务diagnosticYes来验证它,这就是我所说的“这是因为安装程序中基于约定的注册已拾取泛型混凝土类并将其注册为泛型类型,然后无法解析”。我知道原因,我想知道解决方案:)解决方案很简单,而不是
。选择()
使用
。Where(somethingToFilterUnwantedTypesOut)
这有点像经典描述的“如何用三个简单的步骤飞上月球”。。。我知道
.Where()
操作符(很明显,我在问题中提到了它)。我想知道的是如何最好地实现
something以过滤无格式的typesout
,或者类似的方法来防止这种情况的发生。这取决于您到底想防止什么情况发生。这种特殊的类型?有泛型吗?您在更新的答案中得到的答案将在此场景中完成任务。如果您只有这一种类型作为例外,这是非常好的。