使用 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;
我正在 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;