在Castle Windsor,如何为所有找到的泛型类型的实现注册通用接口的许多实现之一?

时间:2017-06-08 16:16:06

标签: c# generics dependency-injection inversion-of-control castle-windsor

有接口......

IThing
IWrapping<IThing>

...由Things ...

实施
Cookie    : IThing
Carmel    : IThing
Chocolate : IThing

...和Wrappings为他们......

Paper <TThing> : IWrapping<TThing> where TThing is IThing
Foil  <TThing> : IWrapping<TThing> where TThing is IThing

...我选择Wrapping的一个实现来运行应用程序,而忽略另一个。要为Wrapping的所有已知实现注册所选IThing,我目前必须列出所有这些实现:

Component.For<IWrapping<Cookie>>()   .ImplementedBy<Paper<Cookie>>(),
Component.For<IWrapping<Carmel>>()   .ImplementedBy<Paper<Carmel>>(),
Component.For<IWrapping<Chocolate>>().ImplementedBy<Paper<Chocolate>>(),

如何一次注册所有这些?

Component.For<IWrapping<IThing>>()
    .ImplementedBy<Paper<ALL_FOUND_IMPLEMENTATIONS_OF_ITHING>>(), // One place to switch between Paper and Foil

1 个答案:

答案 0 :(得分:0)

由于您在Castle中处理泛型类型参数,因此您无法使用与您一直使用的完全相同的流畅语法。

您可以做的是以下单行:

container.Register(Component.For(typeof(IWrapping<>)).ImplementedBy(typeof(Paper<>)));
var cookieWrapper = container.Resolve<IWrapping<Cookie>>();

解决依赖关系后,您将获得以下结果:

Screenshot of the result upon resolving the wrapper

这是基于以下对象依赖项设置(我镜像了你在帖子中添加的内容,但只是想确保你全面了解我为重现这一点所做的工作):

public interface IThing {}
public interface IWrapping<IThing> {}
public class Paper<TThing> : IWrapping<TThing> where TThing : IThing {}
public class Cookie : IThing {}
public class Carmel : IThing{}
public class Chocolate : IThing{}