Castle.Windsor拦截器的生活方式

时间:2013-01-14 15:55:08

标签: inversion-of-control castle-windsor ioc-container interceptor

在我的[Webmethod]中,我有这样的代码。

var something = container.ResolveSomething();
something.Run();

除了一个已定义为PerWebRequest的生活方式之外的所有已注册组件。一个注册为Singleton(记录器)。 对于某些组件,我已经定义并配置了Interceptor,它将记录方法调用及其结果。

我的问题是:如果我使用Lifestyle PerWebRequest注册此Interceptor,我会遇到问题吗?如果我们确实想要这样做,Documentation建议让所有拦截器瞬间使用其他生活方式。如果我用生活方式瞬态注册拦截器,我的大约100种方法中的任何一种都必须看起来像这样。

IComponent component = null;
try
{
    component = container.ResolveComponent();
    compoment.Run();
}
finally
{
    container.Release(component);
}
那么更多样板,然后真正的代码。

这是我的拦截器:

public class LoggingInterceptor : IInterceptor
{
    private readonly ILogger logger;

    public LoggingInterceptor(ILogger logger)
    {
        this.logger = logger;
    }

    public void Intercept(IInvocation invocation)
    {
        var call = string.Format("{0}.{1}({2})", invocation.TargetType.FullName, invocation.Method.Name, string.Join(", ", invocation.Arguments.Select(arg => arg.ToString()).ToArray()));

        try
        {
            logger.Info(call);
            invocation.Proceed();

            logger.Info("Result: " + call + " = " + invocation.ReturnValue);
        }
        catch (Exception e)
        {
            logger.Error(call, e);
            throw;
        }
    }
}

我知道WCF更适合IoC,但我必须继续使用ASP.NET WebServices。

1 个答案:

答案 0 :(得分:4)

我的理解是,即使Interceptor是瞬态的,它的生命周期也会被拦截的组件束缚。它将与截获的组件一起发布,因为它是由容器跟踪的。