动态代理的5模式使用示例和Mixin模式_asp.net教程-查字典教程网
动态代理的5模式使用示例和Mixin模式
动态代理的5模式使用示例和Mixin模式
发布时间:2017-01-07 来源:查字典编辑
摘要:重量级的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);

}

}

第二种: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);

}

}

第三种: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);

}

}

第四种: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);

}

}

第五种: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);

}

}

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);

}

}

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新asp.net教程学习
    热门asp.net教程学习
    编程开发子分类