介紹
我很早之前一直在做mvc5 scaffolder的開發功能做的已經非常完善,使用代碼對mvc5的項目開發效率確實能成倍的提高,就算是剛進團隊的新成員也能很快上手,如果你感興趣 可以參考 http://neozhu.github.io/MVC5-Scaffolder/#/ https://github.com/neozhu/MVC5-Scaffolder
但是mvc5 scaffolder 有一個致命的弱點,無法通過升級的方式支持.net core mvc 項目,而asp.net core mvc 的 scaffolder通過 https://github.com/aspnet/Scaffolding 詢問得知只能自定義現有的模板 ,無法添加自定義的輸入參數,也無法生成定義其它的項目文件,局限性非常大,沒有mvc5 scaffolder那么方便,當然這里也不排除我對 https://github.com/aspnet/Scaffolding 項目的研究還不夠深入.
替代方案
那么要在asp.net core 項目中使用類似代碼生成工具,還有一個方案就是自定義擴展Visual Studio.net Extensions插件來實現.目前我做了一個原型(還沒有去完善各個類的模板),具體的功能就是在Abp vnext項目中根據定義好的實體對象(Acme.BookStore.Domain\Book)快速的在Acme.BookStore.Application 項目中生成dto,appservice這些功能類.國內有幾abp社區做的非常好,52abp,abphelper,有的是收費的,也有免費的但版本已經很久沒有更新了.
功能演示
技術點分享
下面我把在開發Visual Studio.net Extensions中遇到問題和一些自己通過Google查找獲取的資料分享給有這方面需求的朋友.
Visual Studio.net Extensions插件的運行環境是.net 和 COM(非托管)混合開發,大部分都是非托管API,調式非常麻煩,但是github上還是有不少的案例可以參考,我就是用 https://github.com/madskristensen/AddAnyFile 項目基礎上添加了自己的功能
主要需要了解的知識點就是AsyncPackage 這個API,另外需要清楚Solution,Project,ProjectItems的關系.如何讀取Project下面的Class 文件把Class解析出來,包含ClassName,Property,Methods(Functions),這些信息對后面的代碼生成非常重要,這里是無法使用.net Assembly 通過反射來獲取的.當你在遍歷ProjectItems時區分是文件還是文件夾,是類庫,還是資源文件...都需要通過Kind(一竄GUID)去區分.(https://docs.microsoft.com/en-us/dotnet/api/envdte.constants?view=visualstudiosdk-2017)

public IEnumerable<ProjectItem> GetProjects(EnvDTE.ProjectItems projectItems) { foreach (EnvDTE.ProjectItem item in projectItems) { yield return item; if (item.SubProject != null) { foreach (EnvDTE.ProjectItem childItem in GetProjectItems(item.SubProject.ProjectItems)) if (childItem.Kind == EnvDTE.Constants.vsProjectItemKindSolutionItems) yield return childItem; } else { foreach (EnvDTE.ProjectItem childItem in GetProjectItems(item.ProjectItems)) if (childItem.Kind == EnvDTE.Constants.vsProjectItemKindSolutionItems) yield return childItem; } } }
剩下的功能就比較簡單了,開發彈出的Window實現參數的設置,比如獲取實體類生成的類文件..這完全用wpf開發就可以了
接下來根據這些Class生成對應項目文件就簡單了,提供了一個ProjectHelpers 對Project做了一些封裝,可以通過項目路徑,namesapce,添加/刪除文件等常用方法.
功能演示(https://1drv.ms/v/s!AvQJerObIvHt1AM8CpxAuEwkAs2g)
源代碼(https://github.com/neozhu/abpvnextsmartcodegenerator)
如何感興趣可以相互交流一下.