在 CAP 中使用 AOP ( Castle.DynamicProxy )

简介

本篇文章主要介绍如何在 CAP 中集成使用 Castle.DynamicProxy,Castle DynamicProxy 是一个用于在运行时动态生成轻量级.NET代理的库。代理对象允许在不修改类代码的情况下截取对对象成员的调用。可以代理类和接口,但是只能拦截虚拟成员。

为什么需要使用 AOP

Castle.DynamicProxy 为 AOP 的一种实现方式,AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

Castle.DynamicProxy 可以帮助你方便的创建代理对象,代理对象可以帮助构建灵活的应用程序体系结构,因为它允许将功能透明地添加到代码中,而无需对其进行修改。例如,可以代理一个类来添加日志记录或安全检查,而无需使代码知道已添加此功能。

下面可以看到如何在 CAP 中集成使用 Castle.DynamicProxy。

Getting Started

1、安装 NuGet 包

在 集成了 CAP 的项目中安装包,有关如何集成 CAP 的文档请看这里。

注意,Castle.DynamicProxy 这个包已经被废弃,请使用最新的 Castle.Core 包。

<PackageReference Include="Castle.Core" Version="4.4.1" />

2、创建一个 Castle 切面拦截器

可以在这里 dynamicproxy.md 找到相关的文档。

下面为示例代码,继承 Castle 提供的 IInterceptor 接口即可:

[Serializable]
public class MyInterceptor : IInterceptor
{public void Intercept(IInvocation invocation){Console.WriteLine("Before target call");try{invocation.Proceed();}catch (Exception){Console.WriteLine("Target threw an exception!");throw;}finally{Console.WriteLine("After target call");}}
}

拦截器此处命名为 MyInterceptor,你可以在其中处理你的业务逻辑,比如添加日志或其他的一些行为。

3、创建 IServiceCollection 的扩展类

为 IServiceCollection 创建扩展,方面后续调用。

using Castle.DynamicProxy;public static class ServicesExtensions
{public static void AddProxiedSingleton<TImplementation>(this IServiceCollection services)where TImplementation : class{services.AddSingleton(serviceProvider =>{var proxyGenerator = serviceProvider.GetRequiredService<ProxyGenerator>();var interceptors = serviceProvider.GetServices<IInterceptor>().ToArray();return proxyGenerator.CreateClassProxy<TImplementation>(interceptors);});}
}

此处我创建了一个 Singleton 声明周期的扩展方法,建议所有 CAP 的订阅者都创建为 Singleton 即可,因为在 CAP 内部实际执行的时候也会创建一个 scope 来执行,所以无需担心资源释放问题。

4、创建 CAP 订阅服务

创建一个 CAP 订阅类,注意不能放在 Controller 中了。

注意:方法需要为虚方法 virtual,才能被 Castle 重写,别搞忘了加!!!

public class CapSubscribeService: ICapSubscribe
{[CapSubscribe("sample.rabbitmq.mysql")]public virtual void Subscriber(DateTime p){Console.WriteLine($@"{DateTime.Now} Subscriber invoked, Info: {p}");}
}

5、在 Startup 中集成

public void ConfigureServices(IServiceCollection services)
{// 添加 Castle 的代理生成器services.AddSingleton(new ProxyGenerator());// 添加第2步的自定义的拦截类,声明周期为services.AddSingleton<IInterceptor, MyInterceptor>();// 此处为上面的扩展方法, 添加 CAP 订阅 Serviceservices.AddProxiedSingleton<CapSubscribeService>();services.AddCap(x =>{x.UseMySql("");x.UseRabbitMQ("");x.UseDashboard();});// ...
}

以上就完成了所有的集成工作,可以开始进行测试了,有问题欢迎到 Github issue 反馈。

注意:CAP 需要使用 5.0 + 版本,目前只有 preview 版本。

总结

以上就是如何在 CAP 中使用 Castle 进行代理,如果你觉得有用,欢迎右下角点赞。

参考地址:

Castle DynamicProxy 的文档地址:

https://github.com/castleproject/Core/blob/master/docs/dynamicproxy.md

CAP 的 Github 地址:

https://github.com/dotnetcore/cap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

共享服务器硬件要求,共享服务器的配置与管理.doc

编号&#xff1a;Q/NJXX-QR-RJ-2-2012南京信息职业技术学院教 案授课班级41421P、41422P授课时数2序号1时间地点[ ] 年[ ]月[ ] 日 [ ]节 [ ]课程单元共享服务器的配置与管理教学内容能够在Linux中访问Windows的共享资源掌握Linux中安装NFS服务的方法掌握Linux中安装Samba服务的…

Vim as Python IDE on windows

下载安装Python。 从Vim的网站下载vim,建议下Self-installing executable的版本。 编辑vim的配置文件_vimrc 拷贝vimrc_example里面的东东到_vimrc 去掉_vimrc里面的source $VIMRUNTIME/vimrc_example.vim 设置中文支持 "设置编码自动识别, 中文引号显示 "set fileen…

python中matplotlib库实例_Python Matplotlib库入门指南

Matplotlib简介Matplotlib是一个Python工具箱&#xff0c;用于科学计算的数据可视化。借助它&#xff0c;Python可以绘制如Matlab和Octave多种多样的数据图形。最初是模仿了Matlab图形命令, 但是与Matlab是相互独立的.通过Matplotlib中简单的接口可以快速的绘制2D图表初试Matpl…

分布式之数据库和缓存双写一致性方案解析!

一、为什么要写这篇文章&#xff1f;首先&#xff0c;缓存由于其高并发和高性能的特性&#xff0c;已经在项目中被广泛使用。在读取缓存方面&#xff0c;大家没啥疑问&#xff0c;都是按照下图的流程来进行业务操作&#xff1a;但是在更新缓存方面&#xff0c;对于更新完数据库…

四年级上册数学计算机笔记,四年级数学下册笔记整理

第一单元四则运算(1)在没有括号的算式里&#xff0c;如果只有加、减法或者只有乘、除法&#xff0c;都要从左往右按顺序计算。 (2)在没有括号的算式里&#xff0c;有乘、除法和加、减法&#xff0c;要先算乘、除法后算加、减法。 (3)在有括号的算式里&#xff0c;要先算括号里面…

CAP 发布 5.0 版本正式发布

前言今天&#xff0c;我们很高兴宣布 CAP 发布 5.0 版本正式版。同时我们也很高兴的告诉你 CAP 已经有越来越多的用户并且变得越来越流行。在 5.0 版本中&#xff0c;我们主要致力于更好的支持 .NET 5 以及支持新的 Transport&#xff0c;同时在该版本也进行了一些 Bug 修复的工…

电脑上的ofd格式文件如何打开呢_OFD格式的文件怎么打开预览?,来充电吧

我们不管是在工作、学习、下载资源的时候都可能收到别人的文件&#xff0c;但是如果是word或者pfd格式还好&#xff0c;直接在电脑上就可以打开&#xff0c;但是如果是ofd格式的就很难打开了。工具/材料搜狗浏览器、DCS文档在线预览操作方法01打开我们的搜狗浏览器&#xff0c;…

SUSE Linux系统安全配置十条

SUSE由于其出色的性能和对安全较好的控制&#xff0c;吸引了很多企业级用户&#xff0c;目前在国内开始有大量的关键应用。但这并不代表SUSE在使用中就是安全的&#xff0c;SUSE里还有很多安全细节要注意。 目录 1. 补丁、SSH及其它……………………………………3 2. 最小化xi…

用Python画中国地图(二)

在上一篇文章《用Python画一个中国地图》中&#xff0c;我们简单描述了一下如何用Python快速画出一个中国地图的轮廓&#xff0c;似乎没有什么实用价值&#xff0c;这一次我们用实际数据填充它&#xff0c;使它看上去更有意义。上色延续上一次的代码&#xff0c;我们这次还是只…

攻城时服务器维护,8月31日服务器维护更新公告

亲爱的《千年3》玩家&#xff1a;2017年8月31日10&#xff1a;00-14&#xff1a;00将对全区进行服务器例行维护&#xff0c;预计所需时间约为4个小时&#xff0c;如在维护期间无法完成维护内容&#xff0c;开机时间将顺延。本次更新内容包含&#xff1a;1、商城礼包更新2、版本…

php7 匿名继承类_PHP7中的匿名类使用方法_后端开发

PHP 微服务集群搭建 - Hyperf_后端开发Hyperf 是基于 Swoole 4.4 实现的高性能、高灵活性的 PHP 协程框架&#xff0c;内置协程服务器及大量常用的组件&#xff0c;性能较传统基于 PHP-FPM 的框架有质的提升&#xff0c;提供超高性能的同时&#xff0c;也保持着极其灵活的可扩展…

MySql里的My是指谁?

Monty 是一个编程天才。19岁的时候就从赫尔辛基理工大学退学并找了份全职工作&#xff0c;因为在学校里已经不能再教他什么了。33岁的时候他发布了 MySQL&#xff0c;世界上最有名的开源数据库&#xff0c;除了一个库之外&#xff0c;他编写了数据库的全部东西。55岁的时候他抛…

要嫁就嫁程序猿——钱多话少死的早

1程序猿问科比&#xff1a;“你为什么这么成功&#xff1f; ”科比&#xff1a;“你知道洛杉矶凌晨四点是什么样子吗&#xff1f; ”程序猿&#xff1a;“知道&#xff0c;一般那个时候我还在写代码&#xff0c;怎么了&#xff1f;”科比&#xff1a;“额…….”2女神&#xff…

成员函数指针与高性能的C++委托

成员函数指针与高性能的C委托 http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html Member Function Pointers and the Fastest Possible C Delegates 撰文&#xff1a;Don Clugston 翻译&#xff1a;周翔 引子 标准C中没有真正的面向对象的函数指针。这一点对C来…

k8s滚动升级_k8s deployment 滚动更新

正常来说 k8s 的 deployment 在更新时默认就会进行滚动的升级但是实际操作中会发现&#xff0c;滚动更新过程中应用还是会“挂掉”一会儿&#xff0c;大概会有几秒钟网页访问 502。究其原因应该是容器启动后&#xff0c;到应用真正工作起来&#xff0c;中间会有一段时间&#x…

ajax上传文件 获取失败,Ajax上传文件/照片时报错TypeError :Illegal invocation的解决方法...

本篇文章给大家带来的内容是关于Ajax上传文件/照片时报错TypeError &#xff1a;Illegal invocation的解决方法&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。问题Ajax上传文件/照片时报错TypeError &#xff1a;Illegal in…

再见!微软宣布终止对旧版 Microsoft Edge 浏览器的支持

微软宣布自 2021 年 3 月 9 日起终止对旧版 Microsoft Edge&#xff08;Microsoft Edge Legacy&#xff09;浏览器的支持。旧版 Microsoft Edge 是基于 EdgeHTML 的浏览器&#xff0c;自 2015 年 7 月 29 日随新一代 Windows 10 操作系统推出。在结束对旧版 Microsoft Edge 浏览…

机器学习:怎样才能做到从入门到不放弃?

2017年人工智能已经列入了国务院的人工智能发展规划中&#xff0c;人工智能将成为推动中国发展的新生科技力量&#xff0c;并在未来扮演着越来越重要的角色&#xff0c;对于想要从事AI行业的小伙伴们来说&#xff0c;如何能够快速、深入的掌握机器学习相关知识显得尤为重要。下…

最近对kafka的移植工作

Kafka这个linkedin开源的MQ&#xff0c;我在过去的blog简单介绍过。最近3周来&#xff0c;我的工作就是做它的一个Java移植版本&#xff0c;kafka是用scala写的&#xff0c;基于维护和定制的角度&#xff0c;这个拷贝的版本还是用Java。说拷贝&#xff0c;也不尽然&#xff0c;…

有必要服务器虚拟化吗,服务器虚拟化有必要吗

服务器虚拟化有必要吗 内容精选换一换专属云(DeC)专属虚拟化资源池。在专属云内&#xff0c;用户可申请独占物理设备&#xff0c;独享计算和网络资源&#xff0c;并使用可靠的分布式存储。专属虚拟化资源池。在专属云内&#xff0c;用户可申请独占物理设备&#xff0c;独享计算…