使用温莎城堡解析泛型类型约束的接口
本文关键字:泛型类型 约束 接口 城堡 | 更新日期: 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 也会查看泛型类型约束和不同的修饰器并相应地采取行动。