Castle Windsor - 针对开放式泛型接口的IoC注册?

42
Castle Windsor允许注册开放式泛型接口吗?还是我需要分别注册每个可能的类型实例?
例如,如果我使用类型T和Z,则以下内容将在编译时失败,除非我分别使用强类型指定T和Z。
 container.Register(Component
      .For<IAdapterFactory<T,Z>>()
      .ImplementedBy<AdapterFactory<T,Z>>()
      .LifeStyle.PerWebRequest);

“Strong types” 不是一个准确的描述,因为 C# 中的模板使用了强类型。我的观点是 Castle Windsor 似乎不接受注册模板,所以看起来我需要在 ConstrollerInstaller.cs 中枚举所有可能的类型,以便将相同的 IAdapterFactory 注册到多个可能的类型调用中。这似乎很奇怪。 - goldfinger
这不是Windsor的限制,而是.NET运行时的工作方式。 - Krzysztof Kozmic
你能再多说一些吗?“这不是Windsor的限制,而是.NET运行时的工作方式。” - goldfinger
你不能在非闭合泛型类型上关闭通用方法(例如 Component.For<>)。这是 .NET 泛型的工作原理。在这里查看更多信息:http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx - Krzysztof Kozmic
1个回答

80

它被称为开放式通用,是的,Windsor支持这个。

 container.Register(Component
             .For(typeof(IAdapterFactory<,>))
             .ImplementedBy(typeof(AdapterFactory<,>))
             .LifestylePerWebRequest());

1
一个词:哇。谢谢!只是出于好奇,想知道Castle的人为什么决定偏离更标准的C#语法 - 使用<T,Z>而不是<,>? - goldfinger
13
这是唯一适用于此情况的语法,与温莎无关。这仅仅是获取表示开放式泛型类型的 System.Type 实例的方法。 - Krzysztof Kozmic
1
这个答案可能已经帮助了我五次 - 谢谢。 - Richard Bailey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接