手机
当前位置:查字典教程网 >编程开发 >asp.net教程 >动态代理的5模式使用示例和Mixin模式
动态代理的5模式使用示例和Mixin模式
摘要:重量级的ORM和IOC产品离不开动态代理,作为开发人员,多数情况不用关注动态代理的内部实现机制,但是了解其一般的规律和模式还是有必要的,比如...

重量级的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模式1

第二种: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模式2

第三种: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模式3

第四种: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模式4

第五种: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模式5

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模式6

【动态代理的5模式使用示例和Mixin模式】相关文章:

ASP.Net中数据展示控件的嵌套使用示例

关于.NET动态代理的介绍和应用简介

ASP.NET 状态的传递和保存

ASP.NET中TimeSpan的用法

新手入门:C++下的引用类型

asp.net发送邮件示例分享

asp.net在后端动态添加样式表调用的方法

ashx文件的使用小结

从别人那拷下来的几点Session使用的经验

asp.net读取excel文件的三种方法示例

精品推荐
分类导航