使用温莎城堡解析泛型类型约束的接口

本文关键字:泛型类型 约束 接口 城堡 | 更新日期: 2023-09-27 17:56:51

给定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 是一个温莎容器:

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

解析 MyFooHandler 的实例?

使用温莎城堡解析泛型类型约束的接口

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

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
{
...
}

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

我不

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

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

在所有情况下,使用泛型都很有趣,尤其是当您使用简单注射器作为您选择的容器 IMO 时。有关使用泛型的文档,请参阅此处。

因为你使用的是泛型,所以我希望你有很多IFooHandler<TRequest,TResponse>接口的封闭实现。注册所有这些实现是带有简单注入器的单行:

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

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

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