自定義Visual Studio.net Extensions 開發符合ABP vnext框架代碼生成插件[附源碼]

介紹

我很早以前一直在作mvc5 scaffolder的開發功能作的已經很是完善,使用代碼對mvc5的項目開發效率確實能成倍的提升,就算是剛進團隊的新成員也能很快上手,若是你感興趣 能夠參考 http://neozhu.github.io/MVC5-Scaffolder/#/  https://github.com/neozhu/MVC5-Scaffolderios

可是mvc5 scaffolder 有一個致命的弱點,沒法經過升級的方式支持.net core mvc 項目,而asp.net core mvc 的 scaffolder經過 https://github.com/aspnet/Scaffolding 詢問得知只能自定義現有的模板 ,沒法添加自定義的輸入參數,也沒法生成定義其它的項目文件,侷限性很是大,沒有mvc5 scaffolder那麼方便,固然這裏也不排除我對 https://github.com/aspnet/Scaffolding 項目的研究還不夠深刻.git

替代方案

那麼要在asp.net core 項目中使用相似代碼生成工具,還有一個方案就是自定義擴展Visual Studio.net Extensions插件來實現.目前我作了一個原型(尚未去完善各個類的模板),具體的功能就是在Abp vnext項目中根據定義好的實體對象(Acme.BookStore.Domain\Book)快速的在Acme.BookStore.Application 項目中生成dto,appservice這些功能類.國內有幾abp社區作的很是好,52abp,abphelper,有的是收費的,也有免費的但版本已經好久沒有更新了.github

功能演示

技術點分享

下面我把在開發Visual Studio.net Extensions中遇到問題和一些本身經過Google查找獲取的資料分享給有這方面需求的朋友.api

Visual Studio.net Extensions插件的運行環境是.net 和 COM(非託管)混合開發,大部分都是非託管API,調式很是麻煩,可是github上仍是有很多的案例能夠參考,我就是用 https://github.com/madskristensen/AddAnyFile 項目基礎上添加了本身的功能mvc

主要須要瞭解的知識點就是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)app

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;
                }
            }
        }
View Code

剩下的功能就比較簡單了,開發彈出的Window實現參數的設置,好比獲取實體類生成的類文件..這徹底用wpf開發就能夠了asp.net

接下來根據這些Class生成對應項目文件就簡單了,提供了一個ProjectHelpers 對Project作了一些封裝,能夠經過項目路徑,namesapce,添加/刪除文件等經常使用方法.ide

功能演示(https://1drv.ms/v/s!AvQJerObIvHt1AM8CpxAuEwkAs2g)工具

源代碼(https://github.com/neozhu/abpvnextsmartcodegenerator)spa

如何感興趣能夠相互交流一下.

相關文章
相關標籤/搜索