Что такое «ForwardedTypes» в контексте регистрации компонента Castle Windsor? - PullRequest
16 голосов
/ 13 октября 2008

Как говорит субъект, на самом деле! Что они делают?

1 Ответ

17 голосов
/ 23 октября 2008

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

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

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

...