2

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

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

除一个之外的所有注册组件都将生活方式定义为 PerWebRequest。一个注册为 Singleton(记录器)。对于我定义和配置的一些组件,拦截器将记录方法调用及其结果。

我的问题是:如果我用 Lifestyle PerWebRequest 注册这个拦截器会有问题吗?如果我们真的确定要这样做,文档建议可以使所有拦截器瞬变并使用其他生活方式。如果我用生活方式 Transient 注册拦截器,我的大约 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。

4

1 回答 1

4

我的理解是,即使拦截器是瞬态的,它的生命周期也与被拦截的组件绑定。它将与被拦截的组件一起释放,因为它被容器跟踪。

于 2013-01-15T13:23:50.980 回答