Могут ли делегаты быть зарегистрированы в контейнере Castle Windsor IOC? - PullRequest
1 голос
/ 24 ноября 2010

Это, вероятно, глупый вопрос, но могут ли делегаты или события быть зарегистрированы в контейнере IOC (например, Windsor)?

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

Альтернативой было бы просто обернуть любые делегаты в типы для регистрации в контейнере, я полагаю.

Ответы [ 3 ]

7 голосов
/ 24 ноября 2010

Нет необходимости переносить функции или создавать подклассы для регистрации их в Виндзоре.Они работают так же, как и любой другой компонент.Если вам нужно отличить один Func<int> от другого, используйте именованные компоненты и переопределения служб, как и с любым другим компонентом.Пример:

[Test]
public void Example() {
    var container = new DefaultKernel();
    container.Register(Component.For<Func<int>>().Instance(() => 42).Named("42"));
    container.Register(Component.For<Func<int>>().Instance(() => 44).Named("44"));
    container.Register(Component.For<Something>().DependsOn(ServiceOverride.ForKey("f").Eq("44")));
    var s = container.Resolve<Something>();
    Assert.AreEqual(44, s.I);
}

class Something {
    private readonly int i;
    public Something(Func<int> f) {
        i = f();
    }

    public int I {
        get { return i; }
    }
}

Если вы хотите отделить свои регистрации событий с помощью контейнера, просто используйте Средство проводки событий .

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

Как уже отмечалось, все работает отлично, будьте осторожны, если вы используете типизированное фабричное средство *1002*, так как оно может привести к неожиданному поведению.Ваши зависимости от делегатов могут порождать создание прокси-фабрик.См. этот вопрос .

0 голосов
/ 24 ноября 2010

Я бы сказал, что это невозможно, потому что как бы вы решили зависимость?

Если класс запрашивает делегата типа Func<bool> скажем, как бы вы различали разных делегатов?

Ваш вариант переноса делегата будет лучшим решением, поскольку он позволяет вам называть делегатов и объединять их в функциональные секции.

РЕДАКТИРОВАТЬ Оказывается, у Castle Windsor есть способ именования экземпляров, поскольку они зарегистрированы в МОК. Так что это возможно, но вам все равно нужно дать какое-то имя каждому экземпляру. См. ответ Маурисио Шеффера .

...