gpt4 book ai didi

Ninject拦截: Service calling intercepted method not being intercepted when called within itself

转载 作者:行者123 更新时间:2023-12-02 16:54:04 29 4
gpt4 key购买 nike

我有一个注入(inject)了 Ninject 3.0 的服务类。我已经设置了它,因此它的代理是类代理而不是接口(interface)代理。该服务有 2 个方法,第一个方法返回广泛结果,第二个方法调用第一个方法并对其进行过滤。我添加了一个拦截器来缓存第一个方法的结果。

当我从服务外部调用第一个方法时,拦截工作正常。

问题在于,当拦截器调用第二个方法时,它是通过服务本身而不是通过代理来调用它,导致我从服务中调用第一个方法没有被拦截,因此没有被缓存。

我怎样才能让它发挥作用?

更新:添加示例代码

这是我的首要任务,如果有任何内容似乎无法编译,我很抱歉

这是服务类的示例

public class Service : IService
{

[CacheMethodOutput]
public virtual object[] GetObjects(int x)
{
...
}

public virtual object GetObject(int x, int y)
{
return GetObjects(x).SingleOrDefault(o => o.y == y);
}
}

CacheMethodOutputAttribute 是一个简单的属性类

这是一个示例绑定(bind)(这是我确保拥有类代理而不是接口(interface)代理但实际上通过接口(interface)保留注入(inject)引用的方式)

// Binds by type instead of proxy to create a class proxy
Bind<Service>().ToSelf().InSingletonScope().Intercept().With<CacheAttributeInterceptor>()
Bind<IService>().ToMethod<Service>(r => r.Kernel.Get<Service>());

因此,当我从注入(inject) IService 的任何类调用 GetObjects 时,都会触发拦截器,但不会从 Service 本身的 GetObject 方法触发。

CacheAttributeInterceptor 看起来像这样(但实现细节无关):

public class CacheAttributeInterceptor : SimpleInterceptor
{
public ICacheManager CacheManager {get;set;}

public override void BeforeInvoke(IInvocation invocation)
{
if (Attributes.GetCustomAttribute(invocation.Request.Method, typeof(CacheMethodOutputAttribute) != null)
{
string key = GenerateKey(invocation.Request.Method.Name, invocation.Request.Method.Arguments);

object returnValue;
if (!CacheManager.TryGet(key, out returnValue))
{
invocation.Proceed();
returnValue = invocation.ReturnValue;
CacheManager.Add(key, returnValue);
}
else
invocation.ReturnValue = returnValue;

}
else
base.BeforeInvoke(invocation);
}
}

最佳答案

我找到了解决方案/有关问题的更多详细信息。

如果我删除 GetObject 方法上的 virtual 修饰符,它将不再被拦截,并且当它调用 GetObjects 时,incerceptor 将触发。

所有这些让我想到,如果我希望两种方法都被拦截,我需要让拦截器深入工作(如果可能的话)。

关于Ninject拦截: Service calling intercepted method not being intercepted when called within itself,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405931/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com