在我的 [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。