给定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的实例?
答案 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也会查看并根据泛型类型约束和不同的装饰器进行操作。