C# 什么是「;“转发类型”;在温莎城堡组件注册的情况下?

C# 什么是「;“转发类型”;在温莎城堡组件注册的情况下?,c#,inversion-of-control,castle-windsor,C#,Inversion Of Control,Castle Windsor,正如主题所说,真的!它们做什么?转发类型允许您通过单个实现实现多个服务,例如,我们有两个用于处理某种树节点的接口: public interface INodeAlterationProvider { ... } public interface IChildNodeListProvider { ... } 各种组件依赖于其中一个或两个接口。但是,在实现这些接口时,您会发现它们有很多共享功能,并希望将这些实现与其他一些功能合并到一个类中,例如: public class NodeFactory

正如主题所说,真的!它们做什么?

转发类型允许您通过单个实现实现多个服务,例如,我们有两个用于处理某种树节点的接口:

public interface INodeAlterationProvider { ... }
public interface IChildNodeListProvider { ... }
各种组件依赖于其中一个或两个接口。但是,在实现这些接口时,您会发现它们有很多共享功能,并希望将这些实现与其他一些功能合并到一个类中,例如:

public class NodeFactory : INodeAlterationProvider, IChildNodeListProvider { ... }
您可以注册两个NodeFactory实例,它们实现的每个服务一个:

container.Register(Component.For<INodeAlterationProvider>().ImplementedBy<NodeFactory>());
container.Register(Component.For<IChildNodeListProvider>().ImplementedBy<NodeFactory>());
container.Register(Component.For().ImplementedBy());
container.Register(Component.For().ImplementedBy());
但这可能意味着存在两个NodeFactory的单例实例——这并不理想,尤其是在构建成本较高的情况下——并且会使调试等更难理解,特别是在实现了两个以上接口的情况下

这就是转发类型的作用,允许您将多个服务转发到同一个实现,下面是一个这样做的示例:

container.Register(Component.For<INodeAlterationProvider>().Forward<IChildNodeListProvider>().ImplementedBy<NodeFactory>());
container.Register(Component.For().Forward().ImplementedBy());

注意:此处显示的部件注册码仅在主干上可用。

谢谢-这就解释了它是什么。然而,基于这一点,它闻起来像是一条捷径,无法进行“适当”的重构来合并这两个服务…?在我提供的示例中,它很可能是一种味道,我确实即兴想到了它。。。一个更可能的例子可能是类似IExtendedLoggerFactory的东西,它扩展了ILoggerFactory,并由一个满足两个接口的类实现;是的,好的,我看得出来。事实上,我昨晚参加了迈克·哈洛(Mike Hadlow)关于国际奥委会/温莎的演讲,也发现了一些关于trunk的事情:)