Укажите, какую зависимость использовать в инъекции ctor с CastleWindsor 2.5.1.0. - PullRequest
3 голосов
/ 26 января 2012

У меня есть класс с таким конструктором

public class BlotterService : IBlotterService
{
    public BlotterService(IAService aService, IAnotherService anotherService)
    {
        // ...  
    } 
}

и зарегистрированными зависимостями, подобными этому

// Default lifecycle is Singleton
Component.For<IAnotherService >().ImplementedBy<AnotherService >()
Component.For<IAService>().ImplementedBy<AService>() // instance 1 of AService
Component.For<IAService>().ImplementedBy<AService>().Named(
                    "aServiceAlternativeForBlotter") // instance 2 of AService
Component.For<IBlotterService>().ImplementedBy<BlotterService>()

Обычно, когда создаются экземпляры классов, требующих IAService, я хочу первый экземпляр AService, однаков конкретном случае BlotterService я хочу экземпляр 2 AService.

Как я могу зарегистрировать BlotterService / AService в контейнере замка для достижения этой цели?

РЕДАКТИРОВАТЬ: обновление

Я использую Castle 2.5.1.0 и, к сожалению, не могу обновить.

Ответы [ 3 ]

8 голосов
/ 26 января 2012

Изменить последнюю регистрацию на:

Component
    .For<IBlotterService>()
    .ImplementedBy<BlotterService>()
    .DependsOn(Dependency.OnComponent(
        typeof(IAService),
        "aServiceAlternativeForBlotter"))
2 голосов
/ 26 января 2012

Здесь много правильных ответов, но вы застряли на 2.5, поэтому я думаю, что вам нужно сделать что-то вроде этого:

Component.For<IBlotterService>()
    .ImplementedBy<BlotterService>()
    .ServiceOverrides(
        ServiceOverride.ForKey("aService").Eq("aServiceAlternativeForBlotter"));

Если это не работает, то другой альтернативой является то, что вы можете создать интерфейс, производный от IService с именем IAlternateService, и затем иметь зависимость от этого ...

1 голос
/ 26 января 2012

При регистрации BlotterService вам необходимо указать его зависимость с помощью переопределения.

Component.For<IBlotterService>().ImplementedBy<BlotterService>().ServiceOverrides(
                new { aService = "aServiceAlternativeForBlotter" })

Или вы можете использовать одно из переопределений DependsOn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...