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官方文档
Visual Studio 插件

Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架的更多相关文章

  1. Metalama简介2.利用Aspect在编译时进行消除重复代码

    上文介绍到Aspect是Metalama的核心概念,它本质上是一个编译时的AOP切片.下面我们就来系统说明一下Metalama中的Aspect. Metalama简介1. 不止是一个.NET跨平台的编 ...

  2. Metalama简介3.自定义.NET项目中的代码分析

    本系列其它文章 使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在 ...

  3. Metalama简介4.使用Fabric操作项目或命名空间

    使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在编译时进行消除重 ...

  4. Metalama简介5.配合VisualStudio自定义重构或快速操作功能

    使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在编译时进行消除重 ...

  5. 仿写一个简陋的 IOC/AOP 框架 mini-spring

    讲道理,感觉自己有点菜.Spring 源码看不懂,不想强行解释,等多积累些项目经验之后再看吧,但是 Spring 中的控制反转(IOC)和面向切面编程(AOP)思想很重要,为了更好的使用 Spring ...

  6. 老司机学新平台 - Xamarin开发之我的第一个MvvmCross跨平台插件:SimpleAudioPlayer

    大家好,老司机学Xamarin系列又来啦!上一篇MvvmCross插件精选文末提到,Xamarin平台下,一直没找到一个可用的跨平台AudioPlayer插件.那就自力更生,让我们就自己来写一个吧! ...

  7. RCF:一个相当不错的C++分布式RPC框架

    RCF(远程调用框架)是一个可以移植的C++进程间通信框架,使用C++语言特性,提供了一个简单高效的编写分布式C++软件的途径.RCF利用编译时多态清晰分开了接口和实现. 和传统的RPC框架如CORB ...

  8. 实现一个简单的侧边导航Winform程序框架

    目录 简介 实现导航面板 实现方法 使用方法 实现标题栏 窗体拖拽及最大化 自定义窗体按钮 标题显示 按钮设置 实现状态栏 整体使用 参考文章 简介 每次新项目都要想着界面怎么设计好,但想来想去上位机 ...

  9. 用C3中的animation和transform写的一个模仿加载的时动画效果

    用用C3中的animation和transform写的一个模仿加载的时动画效果! 不多说直接上代码; html标签部分 <div class="wrap"> <h ...

随机推荐

  1. ssm 关于mybatis启动报Result Maps collection already contains value for ...的问题总结

    Result Maps collection already contains value for com.zhaike.mapping.ChapterMapper.BaseResultMap Err ...

  2. kali下对Docker的详细安装

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 前言 Docker是渗透测试中必学不可的一个容器工具,在其中,我们能够快速创建.运行.测试以及部署应用程序.如,我们对一些漏洞进行本地复现时,可以 ...

  3. 前端知识之css样式

    前端之CSS样式 css介绍 css是为html标签设置样式的 css由选择器和声明组成 声明包括属性和属性值 声明之间用分号:隔开 css注释 /注释类容/ css的几种引入方式 行内样式 不推荐使 ...

  4. [SPDK/NVMe存储技术分析]006 - 内存屏障(MB)

    在多核(SMP)多线程的情况下,如果不知道CPU乱序执行的话,将会是一场噩梦,因为无论怎么进行代码Review也不可能发现跟内存屏障(MB)相关的Bug.内存屏障分为两类: 跟编译有关的内存屏障: 告 ...

  5. 几种常用的MOS管参数、应用电路及区别:IRF540N、IRF9540N、IRF9540

    1. IRF540N,N沟道,100V,33A,44mΩ@10V 栅极(Gate-G,也叫做门极),源极(Source-S), 漏极(Drain-D) 漏源电压(Vdss) 100V 连续漏极电流(I ...

  6. CF1404E Bricks (最大权独立集)

    考虑把答案进行转化,通过分矩形条,我们能去掉一些夹在#之间的边 那么答案= #个数 - 能去掉的边个数 但去掉是有限制的,同一个#格子的横边和竖边不能同时去掉 把边转化成点,限制变成边. 横竖边的点 ...

  7. VUE常见问题

    VUE常见问题 对于MVVM的理解 MVVM 是 Model-View-ViewModel 的缩写 Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑 View 代表UI 组件, ...

  8. Spring---Spring专题(二)

    1.Spring配置数据源 1.1 数据源(连接池)的作用 数据源(连接池)是提高程序性能而出现的 事先实例化数据源,初始化部分链接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 ...

  9. springboot项目配置类

    一.在springboot项目中,如果不进行配置,直接访问静态页面是无法访问的,需要进行配置,springboot舍弃了XML文件的配置方式,这里我们采用开发配置类的方式.新建MvcConfig类,加 ...

  10. python 元组tuple 增删改查操作

    初始化: data_tuple = () data_tuple1 = (1,) data_tuple2 = tuple() 新增: data_tuple+data_tuple1 (data_tuple ...