【问题标题】:Lifestyle of Castle.Windsor interceptorsCastle.Windsor 拦截器的生活方式
【发布时间】:2013-01-14 15:55:08
【问题描述】:

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

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

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

我的问题是:如果我用 Lifestyle PerWebRequest 注册这个拦截器会不会有问题? Documentation 建议让所有拦截器瞬态并使用其他生活方式,如果我们真的确定要这样做的话。如果我用生活方式 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。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多