Как настроить экземпляр одного компонента, предоставляющий несколько служб в Castle.Windsor? - PullRequest
6 голосов
/ 26 марта 2009

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

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

Например:

interface IA { }
interface IB { }
class AB : IA, IB { ... } 

Я хочу, чтобы один экземпляр AB предоставлял услуги как IA, так и IB.

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

лол, я думаю, это было ясно, как грязь! : P

Кто-нибудь понимает, что я имею в виду, и у кого-нибудь есть идеи, как мне добиться этого с помощью конфигурации XML для компонентов?

Ответы [ 4 ]

3 голосов
/ 26 марта 2009

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

Основная выплата сообщения на форуме :

container.Register(Component.For<IEntityIndexController, ISnippetController>()
.ImplementedBy<SnippetController>()
.LifeStyle.Transient); 

Решение состоит в том, чтобы использовать свободный интерфейс (и недавнюю сборку транка), и не было возможности настроить в xml, который я видел в последний раз. Тем не менее, может быть возможно с возможностью.

Удачи!

1 голос
/ 15 июля 2009

Вы пробовали использовать метод Forward:

container.Register(Component.For<IEntityIndexController>()
.ImplementedBy<SnippetController>()
.Forward (typeof(ISnippetController))
.LifeStyle.Transient);

Из моих экспериментов и из документации:

зарегистрировать типы услуг от имени этого компонента

Я думаю, что это должно сработать.

0 голосов
/ 05 июня 2014

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

Classes.FromThisAssembly().Where(t => t.FullName == "Namespace.Classname").WithServiceAllInterfaces()

Кажется, для меня все получается.

0 голосов
/ 26 марта 2009

Вы можете зарегистрировать экземпляр объекта (вместо реализации), чтобы отвечать за различные реализации:

  var ab = new AB();
  container.Register( Component.For<IA>().Instance( ab) );
  container.Register( Component.For<IB>().Instance( ab) );

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

...