DispatchProxy實現動態代理及AOP


DispatchProxy類是DotnetCore下的動態代理的類,源碼地址:Github,官方文檔:MSDN。主要是Activator以及AssemblyBuilder來實現的(請看源碼分析),園子里的蔣老大提供的AOP框架Dora的實現也是大量使用了這兩個,不過DispatchProxy的實現更簡單點。

AOP實現:

#region 動態代理 dispatchproxy aop示例
class GenericDecorator : DispatchProxy
{
    public object Wrapped { get; set; }
    public Action<MethodInfo, object[]> Start { get; set; }
    public Action<MethodInfo, object[], object> End { get; set; }

    protected override object Invoke(MethodInfo targetMethod, object[] args)
    {
        Start(targetMethod, args);
        object result = targetMethod.Invoke(Wrapped, args);
        End(targetMethod, args, result);
        return result;
    }
}

interface IEcho
{
    void Echo(string message);
    string Method(string info);
}

class EchoImpl : IEcho
{
    public void Echo(string message) => Console.WriteLine($"Echo參數:{message}");

    public string Method(string info)
    {
        Console.WriteLine($"Method參數:{info}");
        return info;
    }
}
#endregion

調用:

static void EchoProxy()
{
    var toWrap = new EchoImpl();
    var decorator = DispatchProxy.Create<IEcho, GenericDecorator>();
    ((GenericDecorator)decorator).Wrapped = toWrap;
    ((GenericDecorator)decorator).Start = (tm, a) => Console.WriteLine($"{tm.Name}({string.Join(',', a)})方法開始調用");
    ((GenericDecorator)decorator).End = (tm, a, r) => Console.WriteLine($"{tm.Name}({string.Join(',', a)})方法結束調用,返回結果{r}");
    decorator.Echo("Echo");
    decorator.Method("Method");
}

DispatchProxy是一個抽象類,我們自定義一個派生自該類的類,通過Create方法建立代理類與代理接口的依賴即可。結果:

首先,我們要有三個概念:代理接口、委托類、代理類;分別對應着上面示例代碼里面的IEcho、EchoImpl、GenericDecorator。我們動態的創建一個派生自代理接口的代理類,同時封裝委托類的實例,那么我們調用代理類的方法實質上就是在調用內部的委托類的方法,因此我們只需要在代理類的特定方法前后注入邏輯即可完成AOP操作。 這個思路也是上面提到的Dora框架中攔截器的思路。也是絕大數AOP框架實現的基本思路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM