使用 Ninject 展开拦截的代理

Unwrapping intercepted proxy with Ninject

我正在 Ninject 中试验拦截器和动态代理,我遇到过这样一种情况,我确实需要 'unwrap' class 的代理实例基础实例。这可能吗?看起来应该很简单,但我找不到方法。

成功调用拦截器:

[MyInterceptorAttribute()]
public virtual int MethodCall(int input)

但是我想找到并实例化每个 class 属性出现的非代理版本:

var methods = assembly.GetTypes()
            .SelectMany(t => t.GetMethods())
            .Where(m => Attribute.IsDefined(m, typeof(MyInterceptorAttribute)))
            .ToList();

foreach(var method in methods) {
    // The proxied instance
    instance = kernel.Get(method.DeclaringType);
}

如何获取非代理实例?

据我所知,Ninject 本身不提供任何用于访问代理目标的特定接口。对于某些类型的代理(class 代理),这甚至是不可能的,因为代理实际上是从代理类型继承的,因此在访问代理时没有明显的区别。

如果您将 Ninject 与 castle 动态代理一起使用,this SO Q/A 显示有关如何访问其他类型代理的代理类型的方法。

如果您有权访问激活上下文,则可以执行以下操作:

var reference= new InstanceReference()
        {
            Instance = yourWrappedObject
        };
new DynamicProxyProxyFactory(context.Kernel).Unwrap(context,reference);

return reference.Instance;