zoukankan      html  css  js  c++  java
  • 自定义Visual Studio.net Extensions 开发符合ABP vnext框架代码生成插件[附源码]

    介绍

    我很早之前一直在做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.DomainBook)快速的在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

    剩下的功能就比较简单了,开发弹出的Window实现参数的设置,比如获取实体类生成的类文件..这完全用wpf开发就可以了

    接下来根据这些Class生成对应项目文件就简单了,提供了一个ProjectHelpers 对Project做了一些封装,可以通过项目路径,namesapce,添加/删除文件等常用方法.

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

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

    如何感兴趣可以相互交流一下.

  • 相关阅读:
    mongodb.conf配置文件
    mongodb创建普通角色和普通用户
    add unique index 注意事项
    error: src refspec master does not match any
    innodb_data_file_path配置变更引发mysql重启失败
    time_zone参数配置
    主键有无检测
    gdb在线修改mysql变量
    mybatis连接数据库
    mongo登录
  • 原文地址:https://www.cnblogs.com/neozhu/p/10416530.html
Copyright © 2011-2022 走看看