在我的[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。
答案 0 :(得分:4)
我的理解是,即使Interceptor是瞬态的,它的生命周期也会被拦截的组件束缚。它将与截获的组件一起发布,因为它是由容器跟踪的。