2015-09-10 2 views
1

Я использую Castle Windsor, который обычно качается, однако я хочу, чтобы он вызывал метод на моем компоненте, когда он создан, и, похоже, достиг ограничения с помощью OnCreate. Для exaxmple:Невозможно вызвать компонентный метод из Castle Windsor OnCreate

interface IService1 
{ 
    void op1(); 
} 

interface IService2 
{ 
    void op2(); 
} 

class MyComponent : IService1, IService2 
{ 
    public void Init() // not part of either service 
    { 
    } 

    public void op1() 
    { 
    } 

    public void op2() 
    { 
    } 
} 

// I want to call the component's Init() method when it's created, which isn't part of the service contract 
container.Register(Component.For<IService1, IService2>().ImplementedBy<MyComponent>().OnCreate(s => s.Init())); 

// I could call something from IService1 
container.Register(Component.For<IService1, IService2>().ImplementedBy<MyComponent>().OnCreate(s => s.op1())); 

// But I can't call anything from any of the other services 
container.Register(Component.For<IService1, IService2>().ImplementedBy<MyComponent>().OnCreate(s => s.op2())); 

Первая регистрация не будет компилировать, жалуясь, что он «не может разрешить символ Init», так как экземпляр передается делегата типа IService1. OnCreate кажется немного ограниченным для меня, так как в третьем случае, когда есть несколько обслуживаемых служб, это позволяет вам привязываться к первой, которую вы объявляете. Мне пришлось бы поменять IService1 и IService2 вокруг, чтобы позвонить op2, но это только проблема.

Почему не передается в делегате тип зарегистрированного компонента? Тогда я был бы свободен назвать любой метод, который мне нравится. Есть ли способ обойти это? Предположим, я не могу поместить код Init() в конструктор компонента.

+0

Я собирался упомянуть [загрузочный объект] (https://github.com/castleproject/Windsor/blob/master/docs/startable-facility.md#dedicated-startstop -методы), но он действительно хорошо работает только с одиночками. –

ответ

1

Не ограничивается строго типизированный характером C#

Да, кстати API построен он базируется от первой службы компоненты, но вы всегда можете бросить его вниз до его фактического типа (или вторичный сервис)

.OnCreate(s => ((MyComponent)s).Init()) 

в качестве альтернативы реализации Castle.Core.IInitializable или System.ComponentModel.ISupportInitialize (если вы не хотите, чтобы ваши компоненты для ссылки Виндзор), и тогда вы не будете нуждаться в .OnCreate() вообще.

Для дальнейшего использования, here's the relevant documentation.

+1

Не могу поверить, что я не думал о кастинге. Duh! – batwad