【问题标题】:Resolving Interface with generic type constraint with Castle Windsor使用 Castle Windsor 解析具有泛型类型约束的接口
【发布时间】:2015-06-18 12:55:05
【问题描述】:

鉴于 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 */
    }
}

我将如何在 Castle Windsor 中注册它以便我可以使用(其中 IoCContainer 是 WindsorContainer:

Global.IoCContainer.Resolve<IFooHandler<FooRequest, FooResponse>>();

要解析 MyFooHandler 的实例?

【问题讨论】:

    标签: c# generics castle-windsor


    【解决方案1】:

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

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
        Component.For(typeof(IRepository<>)).ImplementedBy(typeof(Repository<>))
    }
    );
    
    public class Repository<T> : IRepository<T> where T : class, IEntity
    {
    ...
    }
    

    因此,我发现注册和解析泛型对于使用接口注册和解析泛型非常简单。周围有很多关于城堡和泛型的问题。

    【讨论】:

      【解决方案2】:

      我不熟悉 Castle & Windsor,但我很确定这是一个不受此 DI 容器支持的用例。

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

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

      因为您使用的是泛型,所以我希望您有许多 IFooHandler&lt;TRequest,TResponse&gt; 接口的封闭实现。使用 Simple Injector 注册所有这些实现是一件简单的事情:

      var container = new Container();
      container.RegisterManyForOpenGeneric(typeof(IFooHandler<,>)
                                              , Assembly.GetExecutingAssembly());
      
      // resolve:
      container.GetInstance<IFooHandler<FooRequest, FooResponse>>();
      

      有许多高级选项,您可以使用它们来大大提高应用程序的“SOLIDness”。这些都可以在文档中找到。

      我想提一个具体的: 通过注册一个开放的通用装饰器,Simple Injector 能够检索用这个(或更多)装饰器装饰的实例。此功能使坚持SOLID 设计并仍然实现最先进的场景和/或横切关注点变得超级容易。 请注意,即使在这种情况下,Simple Injector 也会查看泛型类型约束和不同的装饰器并据此采取行动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多