【发布时间】: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