Я использую Castle Windsor 3.0.
У меня есть компонент, который должен запускаться автоматически после фазы регистрации.
Я также хотел бы перехватывать исключения из методов Start / Stop и регистрировать их детали.
Чтобы сделать мой компонент запускаемым, я использовал средство запуска, которое идет в комплекте с Windsor:
container.AddFacility<StartableFacility>(f => f.DeferredStart());
Я создал собственный перехватчик, подобный этому:
class ExceptionLoggerInterceptor : IInterceptor
{
IExceptionLogger m_ExceptionLogger;
public ExceptionLoggerInterceptor(IExceptionLogger exceptionLogger)
{
if (exceptionLogger == null)
throw new ArgumentNullException("exceptionLogger");
m_ExceptionLogger = exceptionLogger;
}
public void Intercept(IInvocation invocation)
{
try
{
invocation.Proceed();
}
catch (Exception ex)
{
m_ExceptionLogger.Write(ex, invocation.Method.Name, invocation.TargetType.Name);
}
}
}
и я зарегистрировал компонент следующим образом:
Component.For<IExceptionLogger>()
.ImplementedBy<EnterpriseLibraryExceptionLogger>()
.LifeStyle.Singleton,
Component.For<ExceptionLoggerInterceptor>()
.LifeStyle.Singleton,
Component.For<IWorkflowService>()
.ImplementedBy<WorkflowService>()
.LifeStyle.Singleton
.StartUsingMethod(c => c.Start)
.StopUsingMethod(c => c.Stop)
.Interceptors(InterceptorReference.ForType<ExceptionLoggerInterceptor>()).Anywhere
Для проверки я кодировал грязный
throw new Exception();
в реализации метода Start компонента. На этапе регистрации, когда Windsor автоматически вызывает метод Start для компонента, генерируется исключение, но он никогда не перехватывается моим пользовательским перехватчиком.
Я провел еще один тест, на этот раз, не используя средство Startable, а скорее вызвав метод Start вручную. Исключение было выдано и было перехвачено моим пользовательским перехватчиком.
Итак, как следует из заголовка этого поста, есть ли способ перехватить методы, вызываемые средством Startable с помощью Windsor?
Привет
Луи-Пьер Бомон