使用Castle Windsor解决具有泛型类型约束的接口

时间:2015-06-18 12:55:06

标签: c# generics castle-windsor

给定FooRequest和FooResponse是抽象的接口:

 public interface IFooHandler<TRequest, TResponse> where TRequest : FooRequest where TResponse : FooResponse
{
    TResponse CheckFoo(TRequest request);
}

实施:

public class MyFooHandler :  IFooHandler<MyFooRequest, MyFooResponse>
{
    public MyFooResponse CheckFoo(MyFooRequest request)
    {
        /* check for foos */
    }
}

我如何在温莎城堡中注册这个,以便我可以使用(其中IoCContainer是WindsorContainer:

)来解决它
Global.IoCContainer.Resolve<IFooHandler<FooRequest, FooResponse>>();

解决MyFooHandler的实例?

2 个答案:

答案 0 :(得分:4)

在温莎城堡,你可以使用这样的代码:

foo

因此,我发现注册和解析泛型非常简单,可以通过接口注册和解析泛型。关于城堡和仿制品的问题很多。

答案 1 :(得分:1)

我不熟悉Castle&amp;温莎,但我非常确定这是一个这个DI容器不支持的用例。

据我所知Simple Injector是唯一一个完全遵循99.9%可能性的开箱即用通用类型约束的容器。 Autofac也知道泛型类型约束,但很容易创建一个类型约束,它在运行时使用Autofac进行编译但会中断。

在所有情况下,泛型都很有趣,但尤其是当您使用Simple Injector作为您选择的容器时,IMO。可以找到使用泛型的文档here

由于您使用的是泛型,我希望您的IFooHandler<TRequest,TResponse>接口有许多已关闭的实现。注册所有这些实现是一个简单的注入器:

var container = new Container();
container.RegisterManyForOpenGeneric(typeof(IFooHandler<,>)
                                        , Assembly.GetExecutingAssembly());

// resolve:
container.GetInstance<IFooHandler<FooRequest, FooResponse>>();

有许多高级选项,您可以使用这些选项来大大提高&#39; SOLIDness&#39;你的申请。这些都可以在文档中找到。

我想提一个特定的一个: 通过注册一个开放的通用装饰器,Simple Injector能够检索用这个(或更多)装饰器修饰的实例。此功能使您可以非常轻松地坚持SOLID设计并仍然实施最先进的方案和/或交叉问题。 请注意,即使在这种情况下,Simple Injector也会查看并根据泛型类型约束和不同的装饰器进行操作。