千家信息网

有哪些动态代理模式和Mixin模式

发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,这篇文章主要介绍"有哪些动态代理模式和Mixin模式",在日常操作中,相信很多人在有哪些动态代理模式和Mixin模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"有哪些
千家信息网最后更新 2025年11月14日有哪些动态代理模式和Mixin模式

这篇文章主要介绍"有哪些动态代理模式和Mixin模式",在日常操作中,相信很多人在有哪些动态代理模式和Mixin模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"有哪些动态代理模式和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(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(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(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(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(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(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);
}
}



到此,关于"有哪些动态代理模式和Mixin模式"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

代码 模式 代理 动态 学习 更多 帮助 开发 实用 必要 接下来 不用 产品 人员 开发期 情况 文章 方法 机制 理论 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发文档问题总结 bg秀刻直播软件开发 网络安全法主题队会内容 软件开发服务资质 敢达争锋对决服务器人多 南京企业网络安全准入控制价格 保证网络安全的核心战略 惠普服务器uid灯 远程桌面用什么服务器好 描述数据库技术 网络技术考研报名时间 计算机软件开发与应用论文 去迪拜做游戏软件开发工作 关于自学网络安全知识培训的通知 上海hp服务器维修调试 网络安全的销售挣钱嘛 谷歌打开网页提示服务器错误 什么是5g网络技术远程驾驶 达梦数据库创建新用户报错 网络安全演讲中学生 北京特色软件开发价格表 数据库子查询多个返回值 网络安全校园日学生代表发言 xftp管理云服务器怎么用 一些关于网络安全的例子 网络安全测评报告的作用 国产的软件开发语言 国家网络安全宣传周上海直播 青浦区服务器回收厂家哪家便宜 沧州万泰网络技术有限公司
0