Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架
Metalama概览
前面一篇文章介绍到了Metalama: https://www.cnblogs.com/chsword/p/dotnet_compile_aop_base_roslyn.html
Metalama是一个基于微软编译器Roslyn的元编程的库,可以解决我在开发中遇到的重复代码的问题。但是其实Metalama不止可以提供编译时的代码转换,更可以提供自定义代码分析、与IDE结合的自定义代码修复与代码重构功能 等功能。
经过面对文档的学习,发现Metalama可以做到很多非常神奇的事情。
例如:
可以为指定类在编译时增加接口如INotifyPropertyChanged。
可以生成编译时的类似AutoMapper方法。
可以自定义代码分析,增强团队代码验证。

Metalama两个核心概念
1. Aspect
Aspect 是AOP的基本概念,它是一个切面,可以对方法、事件、属性、字段、参数以及类型进行操作,这些操作包括编译时修改这些内容或增加代码分析、实时模板、代码重构提示等。
2. Fabric
Fabric 可以对命名空间、类型、项目进行修改,按规则添加Aspect或自定义代码分析。
Metalama的主要功能
1.编译时代码转换
如上图中红色示例,Metalama可以将重复的代码(例如日志、缓存、INotifyPropertyChanged、多线程、重试机制、或其它有大量重复的代码,如属性、方法的定义)封装到为一个AOP Attribute类,从而在编译时向您的代码添加这个AOP类中约定的代码,这个AOP 的Attribute我们以下统一称之为Aspect。
这样做的好处是一方面可以使代码保持干净和简洁,便于阅读和维护,另一方便免除了运行时AOP的性能消耗。
另外对于编译代码的转换,Metalama也提供了IDE的插件支持,具体请见下文。
2.代码验证
如上图中浅蓝色示例,Metalama可以提供自定义的代码分析功能,这里的代码分析更自由,如前面图中示例,可以自己编写验证规则要求某类必须在某命名空间中调用。
当然,这种代码验证非常灵活,它可以基于项目、命名空间、类型、属性、方法、参数、返回值、字段、事件等诸多信息来进行自定义。
在团队中可以使用这种自定义代码验证来进行那些使用.NET自带的分析器、FxCop、Resharper等工具无法提供的代码分析规则。
3.自定义设计时的代码修复、重构功能
如上图深蓝色示例所示,Metalama可以让用户按某规则,为Visual Studio提供CodeFix或重构的提示,这样对于团队中共享某种约定是很有用的。
IDE支持
Metalama 提供了Vistual Studio插件,当然这个插件不是必须使用的,但是的确可以提高一定效率。
直接在VS中扩展 - 扩展管理中查找Metalama并安装即可。

插件提供了可以即时查看编译后代码的功能。

点击Show Metalama Diff即可查看编译后的代码。

引用
Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架的更多相关文章
- Metalama简介2.利用Aspect在编译时进行消除重复代码
上文介绍到Aspect是Metalama的核心概念,它本质上是一个编译时的AOP切片.下面我们就来系统说明一下Metalama中的Aspect. Metalama简介1. 不止是一个.NET跨平台的编 ...
- Metalama简介3.自定义.NET项目中的代码分析
本系列其它文章 使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在 ...
- Metalama简介4.使用Fabric操作项目或命名空间
使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在编译时进行消除重 ...
- Metalama简介5.配合VisualStudio自定义重构或快速操作功能
使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在编译时进行消除重 ...
- 仿写一个简陋的 IOC/AOP 框架 mini-spring
讲道理,感觉自己有点菜.Spring 源码看不懂,不想强行解释,等多积累些项目经验之后再看吧,但是 Spring 中的控制反转(IOC)和面向切面编程(AOP)思想很重要,为了更好的使用 Spring ...
- 老司机学新平台 - Xamarin开发之我的第一个MvvmCross跨平台插件:SimpleAudioPlayer
大家好,老司机学Xamarin系列又来啦!上一篇MvvmCross插件精选文末提到,Xamarin平台下,一直没找到一个可用的跨平台AudioPlayer插件.那就自力更生,让我们就自己来写一个吧! ...
- RCF:一个相当不错的C++分布式RPC框架
RCF(远程调用框架)是一个可以移植的C++进程间通信框架,使用C++语言特性,提供了一个简单高效的编写分布式C++软件的途径.RCF利用编译时多态清晰分开了接口和实现. 和传统的RPC框架如CORB ...
- 实现一个简单的侧边导航Winform程序框架
目录 简介 实现导航面板 实现方法 使用方法 实现标题栏 窗体拖拽及最大化 自定义窗体按钮 标题显示 按钮设置 实现状态栏 整体使用 参考文章 简介 每次新项目都要想着界面怎么设计好,但想来想去上位机 ...
- 用C3中的animation和transform写的一个模仿加载的时动画效果
用用C3中的animation和transform写的一个模仿加载的时动画效果! 不多说直接上代码; html标签部分 <div class="wrap"> <h ...
随机推荐
- 反射getattr
@property 将类中的方法伪装成属性 与@property相关的俩个 @方法.setter 修改操作 @方法.deleter 删除一个property属性的时候会执行被de ...
- vue&uniapp环境搭建以及项目创建(webstorm)
以下是针对webstorm用户上手uniapp框架的学习 vue环境搭建以及配置(脚手架搭建) 首先要明确三样东西 npm:node.js的包管理器 webpack:主要用途是通过CommonJS 的 ...
- HarmonyOS USB DDK助你轻松实现USB驱动开发
HDF(Hardware Driver Foundation)驱动框架是HarmonyOS硬件生态开放的基础,为开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动能力,让开发者能精准且高效地开发驱 ...
- cookie可设置哪些属性?httponly?
chrome控制台的application下可查看: cookie name 字段为一个cookie的名称. value 字段为一个cookie的值. domain 字段为可以访问此cookie的域名 ...
- volatile 变量和 atomic 变量有什么不同?
Volatile 变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不 能保证原子性.例如用 volatile 修饰 count 变量那么 count++ 操作就不是原子 性的. 而 A ...
- Mycat新增数据报错can't fetch sequnce in db,sequnce
Mycat报错 2021-11-08 17:13:01,310 [ERROR][Thread-1] MyCATSequenceProcessor.executeSeq(SesionSQLPair) j ...
- mac终端所有命令不能用
最近一次在用终端敲命令的时候发现命令总是不执行(只有cd命令可以正常执行),返回命令未识别的错误-bash: source: command not found 相信很多朋友也会遇到类似的问题. 解决 ...
- 学习DNS(二)
DNS出现及演化 网络出现的早期 是使用IP地址通讯的,那时就几台主机通讯.但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和w ...
- Qt的.pro文件格式解析
Qt的.pro文件格式解析 在Qt中用qmake生成makefile文件,它是由.pro文件生成而来的,.pro文件的具体格式语法如下: 1.注释 .pro文件中注释采用#号,从"#&quo ...
- SVN回滚步骤