Могу ли я попросить Castle Windsor жаловаться, когда я пытаюсь разрешить один компонент, который зарегистрирован несколько раз? - PullRequest
1 голос
/ 03 мая 2011

Если я зарегистрирую два компонента для одного и того же сервиса, например,

container.Register(
    Component.For<IThing>.ImplementedBy<Thing1>(),
    Component.For<IThing>.ImplementedBy<Thing2>())

, я нахожу удивительным, что если я Resolve получу зависимость от IThing или попросу ее разрешить вручную, Windsor простовыберите один, чтобы дать мне (первый, или Thing1, он появляется).

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

Есть ли способ указать, что, когда служба IThing разрешается в одиночку, в этом случае должно создаваться исключение?

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

Да, Windsor по умолчанию будет использовать первый компонент по умолчанию для любого конкретного сервиса, и он не будет работать, но будет работать так, как на самом деле - мощная функция, используемая в некоторых сложных сценариях, таких как декораторы, шаблона цепочки ответственности.

Какую причину бросить в этих случаях?

В любом случае, если вы действительно уверены, что это то, что вам нужно, я бы написал тест, который захватывает все обработчики из контейнера

container.Kernel.GetAssignableHandlers(typeof(object))

И затем вы можете проверить их и посмотреть, выставляется ли какой-либо Service более чем одним обработчиком, и действовать соответственно.

0 голосов
/ 03 мая 2011

Вы можете создать реализацию IHandlerSelector, которая имеет мнение о разрешении IThing с, если выбрасывается более чем один обработчик для вашей услуги IThing.

Вы можете прочитать больше об обработчикеселекторы здесь .

Селектор обработчика может быть зарегистрирован во время разработки только для того, чтобы избежать каких-либо ошибок в работе:)

Еще одна стратегия, которую я обычно использую.Следующее, это создать пару автоматических тестов, которые загружают контейнер во всех возможных конфигурациях (среда / клиент), а затем делают на нем пару утверждений.

Предполагая, что ваш контейнер полностью загружен, что-то вроде

Assert.That(container.ResolveAll<IThing>(), Has.Length.EqualTo(1));

будет достаточно.

...