介绍
我很早之前一直在做 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;
- }
- }
- }
- View Code
剩下的功能就比较简单了, 开发弹出的 Windows 实现参数的设置, 比如获取实体类生成的类文件.. 这完全用 wpf 开发就可以了
接下来根据这些 Class 生成对应项目文件就简单了, 提供了一个 ProjectHelpers 对 Project 做了一些封装, 可以通过项目路径, namesapce, 添加 / 删除文件等常用方法.
功能演示 https://1drv.ms/v/s!AvQJerObIvHt1AM8CpxAuEwkAs2g (https://1drv.ms/v/s!AvQJerObIvHt1AM8CpxAuEwkAs2g)
源代码(https://github.com/neozhu/abpvnextsmartcodegenerator)
如何感兴趣可以相互交流一下.
来源: https://www.cnblogs.com/neozhu/p/10416530.html