2010-04-16 5 views
0

Это первый раз, когда я использовал перехватчики с плавной регистрацией, и мне что-то не хватает. При следующей регистрации я могу разрешить IProcessingStep, и это прокси-класс, а перехватчик находится в массиве __interceptors, но по какой-то причине перехватчик не вызывается. Любые идеи, что мне не хватает?Создается прокси-сервер, а перехватчик находится в массиве __interceptors, но перехватчик никогда не называется

Спасибо, Дрю

AllTypes.Of<IProcessingStep>() 
.FromAssembly(Assembly.GetExecutingAssembly()) 
.ConfigureFor<IProcessingStep>(c => c 
    .Unless(Component.ServiceAlreadyRegistered) 
    .LifeStyle.PerThread 
    .Interceptors(InterceptorReference.ForType<StepLoggingInterceptor>()).First 
), 
Component.For<StepMonitorInterceptor>(), 
Component.For<StepLoggingInterceptor>(), 
Component.For<StoreInThreadInterceptor>() 


public abstract class BaseStepInterceptor : IInterceptor 
{ 
public void Intercept(IInvocation invocation) 
{ 
    IProcessingStep processingStep = (IProcessingStep)invocation.InvocationTarget; 
    Command cmd = (Command)invocation.Arguments[0]; 
    OnIntercept(invocation, processingStep, cmd); 
} 

protected abstract void OnIntercept(IInvocation invocation, IProcessingStep processingStep, Command cmd); 
} 

public class StepLoggingInterceptor : BaseStepInterceptor 
{ 
private readonly ILogger _logger; 

public StepLoggingInterceptor(ILogger logger) 
{ 
    _logger = logger; 
} 

protected override void OnIntercept(IInvocation invocation, IProcessingStep processingStep, Command cmd) 
{ 
    _logger.TraceFormat("<{0}> for cmd:<{1}> - begin", processingStep.StepType, cmd.Id); 

    bool exceptionThrown = false; 

    try 
    { 
    invocation.Proceed(); 
    } 
    catch 
    { 
    exceptionThrown = true; 
    throw; 
    } 
    finally 
    { 
    _logger.TraceFormat("<{0}> for cmd:<{1}> - end <{2}> times:<{3}>", 
     processingStep.StepType, cmd.Id, 
     !exceptionThrown && processingStep.CompletedSuccessfully 
     ? "succeeded" : "failed", 
     cmd.CurrentMetric==null ? "{null}" : cmd.CurrentMetric.ToString()); 
    } 
} 
} 
+1

см http://stackoverflow.com/questions/1188957/castle-interceptors-with-fluent-interface –

+0

я смотрел это, и это, кажется, не применяются. Мой перехватчик создается и прикрепляется к прокси. Кроме того, использование любого из событий WithService приводит к тому, что служба не регистрируется. – drewburlingame

ответ

1

Как Маурисио Hinter вы, кажется, зарегистрировав компоненты как класс обслуживания, а не интерфейс сервиса. В этом случае, если метод, который вы перехватываете, является виртуальным, вы не сможете его перехватить. Изменение регистрации:

AllTypes.FromAssembly(Assembly.GetExecutingAssembly()) 
.BasedOn<IProcessingStep>() 
.ConfigureFor<IProcessingStep>(c => c 
    .Unless(Component.ServiceAlreadyRegistered) 
    .LifeStyle.PerThread 
    .Interceptors(InterceptorReference.ForType<StepLoggingInterceptor>()).First 
).WithService.Base(), 
+0

Это привело меня к моему окончательному ответу. WithService.Base не работает, потому что у меня было несколько служб одного и того же базового типа для регистрации. Я пошел с WithService.FirstInterface() и создал слой интерфейсов для определения типа шага. Это упрощает чтение кода и упрощает его переопределение через конфигурацию. Спасибо за помощь. – drewburlingame

+0

Спасибо Krzysztof за то, что они должны быть отмечены как виртуальные, чтобы перехватчик Windsor срабатывал (при регистрации как услуги класса, а не через интерфейс). Мой перехватчик Windsor не работал, пока я не сделал это изменение. Позже я вернулся и реорганизовал вещи, чтобы использовать общий интерфейс, а затем виртуальный модификатор не требовался. –