千家信息网

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

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍"有哪些动态代理模式和Mixin模式",在日常操作中,相信很多人在有哪些动态代理模式和Mixin模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"有哪些
千家信息网最后更新 2025年02月02日有哪些动态代理模式和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安全错误 数据库的锁怎样保障安全 进口网络技术与设备报价 各科室签订的网络安全责任书 多数软件开发工作 阿里云服务器数据库有备份吗 数据库连接默认最大连接池 数据库2012主程序在哪里 组建家庭局域网必须要服务器吗 软件开发与项目管理教案 云霄县艺丹网络技术工作室 管理员在部署文件服务器时 选服务好的服务器性能监控 GR管理服务器 自己直播软件开发 网页连接微信小程序云数据库 数据库系统系统构架设计 福建服务器机房厂家直销虚拟主机 数据库创建代码截图 藏品数据库 蟋蟀罐 正规网络技术开发货源充足 江苏电脑软件开发哪家实惠 怎么看我的邮件服务器是多少 人大金仓安全数据库 支付宝打开皖事通连接不了服务器 重庆工控软件开发公司 第七届网络安全技术大赛 交易安全_网络安全 项目经理和软件开发工程师 mysql窗口数据库备注 怎么将文件传到腾讯云服务器 网络技术陪练
0