婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 動態代理的5模式使用示例和Mixin模式

動態代理的5模式使用示例和Mixin模式

熱門標簽:怎樣給陜西地圖標注顏色 地圖標注多少錢一張 廣州銷售外呼系統定制 云狐人工智能電話機器人 400電話辦理信任翰諾科技 ai電銷機器人對貸款有幫助嗎 福州人工智能電銷機器人加盟 宿遷智能外呼系統排名 電銷機器人 數據

重量級的ORM和IOC產品離不開動態代理,作為開發人員,多數情況不用關注動態代理的內部實現機制,但是了解其一般的規律和模式還是有必要的,比如:雖然你開發期間采用了POCO,因為開啟了動態代理,運行期間則不是POCO。本文簡單描述了5種代理生成模式和1種Mixin模式,最后給出一個示例。

復制代碼 代碼如下:

public interface IPlayable
    {
        void Play();
    }

    public class Animal : IPlayable
    {
        public virtual void Play()
        {
            Console.WriteLine("Animal.Play");
        }
    }

    public class Dog : Animal
    {
        public override void Play()
        {
            Console.WriteLine("Dog.Play");
        }
    }

    public interface IRunable
    {
        void Run();
    }

    public class RunAbility : IRunable
    {
        public void Run()
        {
            Console.WriteLine("RunAbility.Run");
        }
    }

    public class AnimalInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine("Before AnimalInterceptor.Intercept");
            if (invocation.InvocationTarget != null)
            {
                invocation.Proceed();
            }
            Console.WriteLine("After AnimalInterceptor.Intercept");
        }
    }

第一種:ClassProxy

復制代碼 代碼如下:

{
                Console.WriteLine("\n*************ClassProxy*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateClassProxyAnimal>(new AnimalInterceptor());
                animal.Play();

                Console.WriteLine(animal.GetType());
                Console.WriteLine(animal.GetType().BaseType);

                var compositeField = animal.GetType().GetField("__target");
                Console.WriteLine(compositeField);

                foreach (var interfaceType in animal.GetType().GetInterfaces())
                {
                    Console.WriteLine(interfaceType);
                }
            }


第二種:ClassProxyWithTarget

復制代碼 代碼如下:

{
                Console.WriteLine("\n*************ClassProxyWithTarget*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateClassProxyWithTargetAnimal>(new Dog(), new AnimalInterceptor());
                animal.Play();

                Console.WriteLine(animal.GetType());
                Console.WriteLine(animal.GetType().BaseType);

                var compositeField = animal.GetType().GetField("__target");
                Console.WriteLine(compositeField);

                foreach (var interfaceType in animal.GetType().GetInterfaces())
                {
                    Console.WriteLine(interfaceType);
                }
            }



第三種:InterfaceProxyWithoutTarget

復制代碼 代碼如下:

{
                Console.WriteLine("\n*************InterfaceProxyWithoutTarget*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateInterfaceProxyWithoutTargetIPlayable>(new AnimalInterceptor());
                animal.Play();

                Console.WriteLine(animal.GetType());
                Console.WriteLine(animal.GetType().BaseType);

                var compositeField = animal.GetType().GetField("__target");
                Console.WriteLine(compositeField);

                foreach (var interfaceType in animal.GetType().GetInterfaces())
                {
                    Console.WriteLine(interfaceType);
                }
            }



第四種:InterfaceProxyWithTarget

復制代碼 代碼如下:

{
                Console.WriteLine("\n*************InterfaceProxyWithTarget*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateInterfaceProxyWithTargetIPlayable>(new Dog(), new AnimalInterceptor());
                animal.Play();

                Console.WriteLine(animal.GetType());
                Console.WriteLine(animal.GetType().BaseType);

                var compositeField = animal.GetType().GetField("__target");
                Console.WriteLine(compositeField);

                foreach (var interfaceType in animal.GetType().GetInterfaces())
                {
                    Console.WriteLine(interfaceType);
                }
            }



第五種:InterfaceProxyWithTargetInterface

復制代碼 代碼如下:

{
                Console.WriteLine("\n*************InterfaceProxyWithTargetInterface*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateInterfaceProxyWithTargetInterfaceIPlayable>(new Dog(), new AnimalInterceptor());
                animal.Play();

                Console.WriteLine(animal.GetType());
                Console.WriteLine(animal.GetType().BaseType);

                var compositeField = animal.GetType().GetField("__target");
                Console.WriteLine(compositeField);

                foreach (var interfaceType in animal.GetType().GetInterfaces())
                {
                    Console.WriteLine(interfaceType);
                }
            }



Mixin模式

復制代碼 代碼如下:

{
                Console.WriteLine("\n*************Mixin*************\n");
                var generator = new ProxyGenerator();
                var options = new ProxyGenerationOptions();
                options.AddMixinInstance(new RunAbility());
                var animal = generator.CreateClassProxyAnimal>(options, new AnimalInterceptor());
                animal.Play();
                (animal as IRunable).Run();

                Console.WriteLine(animal.GetType());
                Console.WriteLine(animal.GetType().BaseType);

                var compositeField = animal.GetType().GetField("__target");
                Console.WriteLine(compositeField);

                foreach (var field in animal.GetType().GetFields())
                {
                    if (field.Name.StartsWith("__mixin"))
                    {
                        Console.WriteLine(field);
                    }
                }

                foreach (var interfaceType in animal.GetType().GetInterfaces())
                {
                    Console.WriteLine(interfaceType);
                }
            }



 


您可能感興趣的文章:
  • 代理模式之Java動態代理實現方法

標簽:宜春 綿陽 延安 黃南 大興安嶺 新疆 曲靖 焦作

巨人網絡通訊聲明:本文標題《動態代理的5模式使用示例和Mixin模式》,本文關鍵詞  動態,代理,的,模式,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《動態代理的5模式使用示例和Mixin模式》相關的同類信息!
  • 本頁收集關于動態代理的5模式使用示例和Mixin模式的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 汤阴县| 颍上县| 嘉兴市| 洛浦县| 仙桃市| 万全县| 天柱县| 鹤壁市| 和硕县| 黄龙县| 来安县| 安泽县| 团风县| 分宜县| 昂仁县| 日喀则市| 西和县| 自贡市| 临武县| 综艺| 四川省| 丰都县| 偏关县| 海伦市| 屯门区| 乐山市| 武鸣县| 朝阳区| 海林市| 土默特左旗| 太仓市| 政和县| 竹北市| 察隅县| 东乌珠穆沁旗| 同江市| 台安县| 区。| 新晃| 温宿县| 卓尼县|