0

上下文

我有一个非通用接口,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()
)
4

1 回答 1

0

一种解决方案是使用属性标记所有此类具体类,例如[RegisterWith(Type t, Type t2)]- 但是建议将与容器相关的代码远离其他所有内容,因此如果可能的话,我想避免这种情况。我确实更喜欢这个解决方案,而不是硬编码容器中不需要的类型 - 它比配置更约定俗成。

于 2013-06-18T14:05:11.670 回答