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