Geo*_*ild 14 c# castle-dynamicproxy dynamic-proxy
使用Castle的动态代理时,我遇到了一些(我认为)奇怪的行为.
使用以下代码:
class Program
{
static void Main(string[] args)
{
var c = new InterceptedClass();
var i = new Interceptor();
var cp = new ProxyGenerator().CreateClassProxyWithTarget(c, i);
cp.Method1();
cp.Method2();
Console.ReadLine();
}
}
public class Interceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine(string.Format("Intercepted call to: " + invocation.Method.Name));
invocation.Proceed();
}
}
public class InterceptedClass
{
public virtual void Method1()
{
Console.WriteLine("Called Method 1");
Method2();
}
public virtual void Method2()
{
Console.WriteLine("Called Method 2");
}
}
Run Code Online (Sandbox Code Playgroud)
我期待获得输出:
然而,我得到的是:
据我所知,如果调用来自类本身之外,动态代理只能代理方法调用,因为当从Program调用而不是从InterceptedClass中调用时,拦截了Method2.
我可以理解,当从代理类中进行调用时,它将不再通过代理,但只是想检查这是否是预期的,如果是,那么无论如何都要查看是否有所有被截获的呼叫他们被叫到哪里?
谢谢
Jon*_*eet 17
编辑:tl; dr - 我刚尝试以不同的方式创建代理,如下所述,它产生你所追求的输出.我只需要改变这个:
var c = new InterceptedClass();
var i = new Interceptor();
var cp = new ProxyGenerator().CreateClassProxyWithTarget(c, i);
Run Code Online (Sandbox Code Playgroud)
对此:
var i = new Interceptor();
var cp = new ProxyGenerator().CreateClassProxy<InterceptedClass>(i);
Run Code Online (Sandbox Code Playgroud)
据我了解,代理生成器有效地创建了一个包装器对象.它们是两个独立的对象 - 一个是围绕另一个的包装器,在包装层中有拦截等.
这是很难看到它如何能够改变什么的实例InterceptedClass确实有自己的方法调用:
如果要使用当前代理创建代码通过包装器进行Method1调用Method2 ,则需要告知现有对象有关包装器的信息,可以是其中的字段,也可以是方法参数.
另外,有可能是创建代理开始与不同的方式-一个在代理是在某种意义上目标对象.我怀疑你可能想看CreateClassProxy而不是CreateClassProxyWithTarget- 我怀疑这是你提供导致你出问题的目标对象的事实.
你所看到的行为是否"预期"或者显然取决于你的期望 - 但这肯定是我所期望的,而不知道任何有关Castle Dynamic Proxy :)的信息
| 归档时间: |
|
| 查看次数: |
6627 次 |
| 最近记录: |