好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 動態代理的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模式的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: YSL水蜜桃色推荐4444| 一级黑寡妇毛片免费视频| 小sao货cao得你舒服么h| 乖宝宝我慢慢来不会疼的| 电影在线观看视频| 欧美黑人猛xxxxbbbb| 清清一区二区三区不卡视频| 日本中文字幕乱码免费| 国产一国产看免费高清片| c语文老师一节课| 淑女的欲望在线观看| 一级做a爰片久久毛片潮喷动漫| 完美世界在线观看免费完整观看| 吻胸揉屁股摸大腿娇喘厨房| 国产一区二区三区在线播放 | 免费高H肉肉视频在线观看| 视频丨9l??丨白浆| 性一交一乱一欲0| 欧美熟老妇人多毛OOXⅩ| 久草一级片| 和漂亮的女同学啪啪| 夫妇当面交换着做完整| 蜜臀AV视频麻豆国产一二三| 99在线精品视频免费观看软件 | 亚洲精品丝袜字幕一区| 男女做爰猛烈啪啪床动作图片| 男人添女人下部全视频观看 | 99**毛片免费播放| 72种姿势欧美久久久久大黄蕉 | 绥滨县| 美女图片1314mm爽爽爽| 白嫩白嫩BBWBBWBBw| 黄色网址免费下载| 青梅晚晚hh浓精| 人妻少妇精品专区牲色AV| 调教亲女乱h文| 高H+双处+1V1+激H| 91精品国产高清久久久久久91| 久久国产精品偷任你爽任你A| 三妻四妾小说全文| HD 亚洲精品白色在线发布时间|