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
即可查看編譯后的代碼。