【发布时间】:2014-07-31 15:49:08
【问题描述】:
这是特定于 LightInject 的拦截。是否可以基于 PerWebRequest 生命周期应用拦截逻辑,以便可以根据用户输入有条件地打开/关闭拦截逻辑?例如。像这样的。
public static void Configure()
{
var serviceContainer = new ServiceContainer();
serviceContainer.EnablePerWebRequestScope();
serviceContainer.Register<ITraceSwitcher, TraceSwitcher>(new PerScopeLifetime());
serviceContainer.Register<IMyService, MyService>(new PerScopeLifetime());
serviceContainer.Intercept(x => x.ServiceType == typeof(IMyService), (y, z) => DefineProxyType(z, IsTracingEnabled));
ServiceLocator.SetLocatorProvider(() => new LightInjectServiceLocator(serviceContainer));
}
private static void DefineProxyType(ProxyDefinition proxyDefinition, Func<bool> isTracingEnabled)
{
if (isTracingEnabled())
proxyDefinition.Implement(() => new MyServiceInterceptor(), m => m.Name == "SomeMethod");
}
private static bool IsTracingEnabled()
{
var traceSwitcher = ServiceLocator.Current.GetInstance<ITraceSwitcher>();
return traceSwitcher.IsTracingEnabled();
}
现在因为 IMyService 生命周期被定义为 PerWebRequest 所以它是为每个 Web 请求创建的,我的印象是它每次创建 MyService 实例时也会调用 Intercept 方法,以便它可以根据是否跟踪动态决定应用拦截逻辑由用户启用或禁用。但是看起来它在第一次请求 IMyService 实例时只调用一次 Intercept 方法,并且对于所有后续请求,它重用相同的拦截机制。
我也知道我可以在 MyServiceInterceptor 中使用 ITraceSwitcher 逻辑,然后决定在那里使用或绕过拦截逻辑,但我想避免在禁用跟踪时创建代理,以避免通过反射产生代理调用的开销,但这只是如果为每个 Web 请求调用 Intercept 方法,则可能。请让我知道它是否可行或有更好的方法?
谢谢,
赛德丹麦语。
【问题讨论】:
标签: dependency-injection aop interception perwebrequest light-inject