Что такое "ForwardedTypes" в контексте регистрации компонента Castle Windsor?

Как говорит предмет, действительно! Что они делают?

Ответы

Ответ 1

Переадресованные типы позволяют вам иметь несколько сервисов, реализованных одной реализацией, для конкретного примера говорят, что у нас есть два интерфейса для работы с древовидными узлами:

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>());

Но это потенциально может означать два одиночных экземпляра NodeFactory, которые не идеальны, особенно если это дорого стоит построить, и могут сделать сложную задачу отладки и т.д., особенно если реализовано более двух интерфейсов.

Здесь вы можете переадресовывать типы, позволяя пересылать несколько сервисов одной и той же реализации, вот пример этого:

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

Примечание: код регистрации компонента, показанный здесь, доступен только на соединительной линии.