有接口......
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
答案 0 :(得分:0)
由于您在Castle中处理泛型类型参数,因此您无法使用与您一直使用的完全相同的流畅语法。
您可以做的是以下单行:
container.Register(Component.For(typeof(IWrapping<>)).ImplementedBy(typeof(Paper<>)));
var cookieWrapper = container.Resolve<IWrapping<Cookie>>();
解决依赖关系后,您将获得以下结果:
这是基于以下对象依赖项设置(我镜像了你在帖子中添加的内容,但只是想确保你全面了解我为重现这一点所做的工作):
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{}