zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

动态代理的5模式使用示例和Mixin模式

代理模式 使用 示例 动态 Mixin
2023-06-13 09:15:12 时间

重量级的ORM和IOC产品离不开动态代理,作为开发人员,多数情况不用关注动态代理的内部实现机制,但是了解其一般的规律和模式还是有必要的,比如:虽然你开发期间采用了POCO,因为开启了动态代理,运行期间则不是POCO。本文简单描述了5种代理生成模式和1种Mixin模式,最后给出一个示例。

复制代码代码如下:


publicinterfaceIPlayable
   {
       voidPlay();
   }

   publicclassAnimal:IPlayable
   {
       publicvirtualvoidPlay()
       {
           Console.WriteLine("Animal.Play");
       }
   }

   publicclassDog:Animal
   {
       publicoverridevoidPlay()
       {
           Console.WriteLine("Dog.Play");
       }
   }

   publicinterfaceIRunable
   {
       voidRun();
   }

   publicclassRunAbility:IRunable
   {
       publicvoidRun()
       {
           Console.WriteLine("RunAbility.Run");
       }
   }

   publicclassAnimalInterceptor:IInterceptor
   {
       publicvoidIntercept(IInvocationinvocation)
       {
           Console.WriteLine("BeforeAnimalInterceptor.Intercept");
           if(invocation.InvocationTarget!=null)
           {
               invocation.Proceed();
           }
           Console.WriteLine("AfterAnimalInterceptor.Intercept");
       }
   }

第一种:ClassProxy

复制代码代码如下:


{
               Console.WriteLine("\n*************ClassProxy*************\n");
               vargenerator=newProxyGenerator();
               varanimal=generator.CreateClassProxy<Animal>(newAnimalInterceptor());
               animal.Play();

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

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

               foreach(varinterfaceTypeinanimal.GetType().GetInterfaces())
               {
                   Console.WriteLine(interfaceType);
               }
           }


第二种:ClassProxyWithTarget

复制代码代码如下:
{
               Console.WriteLine("\n*************ClassProxyWithTarget*************\n");
               vargenerator=newProxyGenerator();
               varanimal=generator.CreateClassProxyWithTarget<Animal>(newDog(),newAnimalInterceptor());
               animal.Play();

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

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

               foreach(varinterfaceTypeinanimal.GetType().GetInterfaces())
               {
                   Console.WriteLine(interfaceType);
               }
           }



第三种:InterfaceProxyWithoutTarget

复制代码代码如下:
{
               Console.WriteLine("\n*************InterfaceProxyWithoutTarget*************\n");
               vargenerator=newProxyGenerator();
               varanimal=generator.CreateInterfaceProxyWithoutTarget<IPlayable>(newAnimalInterceptor());
               animal.Play();

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

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

               foreach(varinterfaceTypeinanimal.GetType().GetInterfaces())
               {
                   Console.WriteLine(interfaceType);
               }
           }



第四种:InterfaceProxyWithTarget

复制代码代码如下:
{
               Console.WriteLine("\n*************InterfaceProxyWithTarget*************\n");
               vargenerator=newProxyGenerator();
               varanimal=generator.CreateInterfaceProxyWithTarget<IPlayable>(newDog(),newAnimalInterceptor());
               animal.Play();

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

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

               foreach(varinterfaceTypeinanimal.GetType().GetInterfaces())
               {
                   Console.WriteLine(interfaceType);
               }
           }



第五种:InterfaceProxyWithTargetInterface

复制代码代码如下:
{
               Console.WriteLine("\n*************InterfaceProxyWithTargetInterface*************\n");
               vargenerator=newProxyGenerator();
               varanimal=generator.CreateInterfaceProxyWithTargetInterface<IPlayable>(newDog(),newAnimalInterceptor());
               animal.Play();

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

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

               foreach(varinterfaceTypeinanimal.GetType().GetInterfaces())
               {
                   Console.WriteLine(interfaceType);
               }
           }



Mixin模式

复制代码代码如下:
{
               Console.WriteLine("\n*************Mixin*************\n");
               vargenerator=newProxyGenerator();
               varoptions=newProxyGenerationOptions();
               options.AddMixinInstance(newRunAbility());
               varanimal=generator.CreateClassProxy<Animal>(options,newAnimalInterceptor());
               animal.Play();
               (animalasIRunable).Run();

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

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

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

               foreach(varinterfaceTypeinanimal.GetType().GetInterfaces())
               {
                   Console.WriteLine(interfaceType);
               }
           }