Ответ 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>());
Примечание: код регистрации компонента, показанный здесь, доступен только на соединительной линии.