上下文
我有一个非通用接口,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 个通用参数,而组件实现类型 Exuinoq.Core.Input.InputEventProvider`2[TState,TInputEvent] 需要 2 个。
这是因为安装程序中基于约定的注册已经选择了泛型具体类并将其注册为泛型类型,然后无法解析。
问题
避免这种情况并防止将来发生在其他班级的最佳方法是什么?异常给出以下建议:
您可以通过提供 IGenericImplementationMatchingStrategy 的实现来指示 Windsor 应该使用哪些类型来关闭此通用组件。
但是,我认为这仅适用于您希望注册一种类型而不是四种不同类型的情况。不过我可能是错的!
目前我已经使用了这种解决方法,但它几乎不可持续:
.Register(
Classes.FromAssemblyContaining<MyClass>()
.Where(t => !typeof(IInputEventProvider).IsAssignableFrom(t))
.WithServiceAllInterfaces()
)