Возможно ли, пока приложение (любого типа, например, консоль, веб-роль, веб-роль в Azure и т. д.) включать или выключать перехватчики Castle Windsor, чтобы избежать перезапуска приложения?
Мой сценарий заключается в использовании перехватчика, подобного приведенному ниже, для регистрации входа в метод и выхода с аргументами.
public class ExampleInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Debug.WriteLine(string.Format("Before method: {0}", invocation.Method.Name));
invocation.Proceed();
Debug.WriteLine(string.Format("After method: {0}", invocation.Method.Name));
}
}
Мой первоначальный подход состоял в том, чтобы сделать что-то вроде этого:
public class InterceptorSelector : IModelInterceptorsSelector
{
public static bool InterceptorOn = false;
public bool HasInterceptors(ComponentModel model)
{
return
typeof(ExampleInterceptor) != model.Implementation
&& InterceptorOn
&& model.Implementation.Namespace.StartsWith("MvcApplication1");
}
public InterceptorReference[] SelectInterceptors(ComponentModel model, InterceptorReference[] interceptors)
{
return new[]
{
InterceptorReference.ForType<ExampleInterceptor>()
};
}
}
Однако я обнаружил, что после того, как перехватчик обработал метод один раз, должно быть некоторое внутреннее кэширование (без сомнения, для повышения производительности), поскольку метод больше не попадает в InterceptorSelector.
Основной вариант использования, который у меня есть для этого, — это WebApi, размещенный в Azure, обслуживающий сотни (если не тысячи) запросов в секунду на нескольких экземплярах виртуальной машины. В случае необходимости отладки живой среды я хочу включить подробное ведение журнала для одного из этих экземпляров, но в то же время не хочу выводить экземпляр виртуальной машины из строя при включении этого ведения журнала.