源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-10-10 00:34 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:动态代理的5模式使用示例和Mixin模式
重量级的ORM和IOC产品离不开动态代理,作为开发人员,多数情况不用关注动态代理的内部实现机制,但是了解其一般的规律和模式还是有必要的,比如:虽然你开发期间采用了POCO,因为开启了动态代理,运行期间则不是POCO。本文简单描述了5种代理生成模式和1种Mixin模式,最后给出一个示例。
[u]复制代码[/u] 代码如下:
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
[u]复制代码[/u] 代码如下:
{                 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);                 }             }
[img]http://files.jb51.net/file_images/article/201311/20131125100916.jpg?20131025101515[/img] 第二种:ClassProxyWithTarget
[u]复制代码[/u] 代码如下:
{                 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);                 }             }
[img]http://files.jb51.net/file_images/article/201311/20131125100954.jpg?20131025101541[/img] [b]第三种:InterfaceProxyWithoutTarget[/b]
[u]复制代码[/u] 代码如下:
{                 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);                 }             }
[img]http://files.jb51.net/file_images/article/201311/20131125101017.jpg?20131025101559[/img] [b]第四种:InterfaceProxyWithTarget[/b]
[u]复制代码[/u] 代码如下:
{                 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);                 }             }
[img]http://files.jb51.net/file_images/article/201311/20131125101041.jpg?20131025101619[/img] [b]第五种:InterfaceProxyWithTargetInterface[/b]
[u]复制代码[/u] 代码如下:
{                 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);                 }             }
[img]http://files.jb51.net/file_images/article/201311/20131125101110.jpg?2013102510170[/img] [b]Mixin模式[/b]
[u]复制代码[/u] 代码如下:
{                 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);                 }             }
[img]http://files.jb51.net/file_images/article/201311/20131125101147.jpg?20131025101728[/img]
 
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部