一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 動態代理的5模式使用示例和Mixin模式

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

2019-11-22 11:56ASP.NET教程網 ASP.NET教程

什么叫"動態代理",代理模式我們都知道,動態代理就是動態生成的代理(采用Emit)。5種代理模式:ClassProxy、ClassProxyWithTarget、InterfaceProxyWithoutTarget、InterfaceProxyWithTarget、InterfaceProxyWithTargetInterface、Mixin模式

重量級的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.CreateClassProxy<Animal>(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);
                }
            }


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

 

第二種:ClassProxyWithTarget

 

復制代碼代碼如下:


{
                Console.WriteLine("\n*************ClassProxyWithTarget*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateClassProxyWithTarget<Animal>(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);
                }
            }



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

 

第三種:InterfaceProxyWithoutTarget

 

復制代碼代碼如下:


{
                Console.WriteLine("\n*************InterfaceProxyWithoutTarget*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateInterfaceProxyWithoutTarget<IPlayable>(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);
                }
            }



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

 

第四種:InterfaceProxyWithTarget

 

復制代碼代碼如下:


{
                Console.WriteLine("\n*************InterfaceProxyWithTarget*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateInterfaceProxyWithTarget<IPlayable>(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);
                }
            }



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

 

第五種:InterfaceProxyWithTargetInterface

 

復制代碼代碼如下:


{
                Console.WriteLine("\n*************InterfaceProxyWithTargetInterface*************\n");
                var generator = new ProxyGenerator();
                var animal = generator.CreateInterfaceProxyWithTargetInterface<IPlayable>(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);
                }
            }



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

 

Mixin模式

 

復制代碼代碼如下:


{
                Console.WriteLine("\n*************Mixin*************\n");
                var generator = new ProxyGenerator();
                var options = new ProxyGenerationOptions();
                options.AddMixinInstance(new RunAbility());
                var animal = generator.CreateClassProxy<Animal>(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);
                }
            }

 

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品一区二区在线观看完整版 | 亚洲六月丁香六月婷婷色伊人 | 变态女王麻麻小说在线阅读 | 国模人体aⅴ | 午夜影院免费体验 | 午夜AV内射一区二区三区红桃视 | 无人视频在线观看完整版高清 | 福利一区在线观看 | 精品视频免费 | 91果冻制片厂天美传媒 | 欧美精品一区二区三区免费 | 调教开发新婚娇妻放荡 | 无码一区国产欧美在线资源 | 亚洲国产在线播放在线 | 桥本有菜在线四虎福利网 | 国产日韩精品一区二区在线观看播放 | 日韩高清一区二区三区不卡 | 国产欧美日韩专区 | 第一福利在线观看永久视频 | 视频免费观看在线播放高清 | 国产剧情一区二区三区 | 国产欧美日韩视频在线观看一区二区 | 亚洲精品www久久久久久久软件 | 无码人妻精品一区二区蜜桃在线看 | 久久综合视频网站 | 极品虎白女在线观看一线天 | 成人精品视频 成人影院 | 国产一区二区不卡视频 | 手机在线观看伦理片 | 亚洲六月丁香六月婷婷色伊人 | 美人老师沦为 | 欧美高清片 | 亚洲精品黄色 | 999热在线精品观看全部 | 亚洲狼人综合干 | 德国高清freexxxx性 | 精品视频一区二区 | 欧美在线视频一区在线观看 | 把美女屁股眼扒开图片 | 国产综合社区 | 臀精插宫NP文|