自定义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.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)
如何感兴趣可以相互交流一下.
自定义Visual Studio.net Extensions 开发符合ABP vnext框架代码生成插件[附源码]的更多相关文章
- C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...
- openlayers4 入门开发系列结合 echarts4 实现散点图(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- 用Darwin开发RTSP级联服务器(拉模式转发)(附源码)
源码下载地址:https://github.com/EasyDarwin orwww.easydarwin.org 在博客 在Darwin进行实时视频转发的两种模式 中,我们描述了流媒体服务器对源端音 ...
- leaflet-webpack 入门开发系列三地图分屏对比(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- cesium 入门开发系列矢量瓦片加载展示(附源码下载)
前言 cesium 入门开发系列环境知识点了解:cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 源代 ...
- asp.net开发中常见公共捕获异常方式总结(附源码)
本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统 ...
- 用GO语言开发editplus编辑器插件(附源码)
我要开发的插件功能极为简单,就是对用户选中的内容进行base64编码或解密工作. 其中所涉及的技术部分主要是GO语言程序开发和editplus插件配置的部分,首先我们来看一下GO语言代码的写法,如下: ...
- openlayers4 入门开发系列之聚合图篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- openlayers4 入门开发系列之迁徙图篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
随机推荐
- 【源码解析】Sharding-Jdbc模块分析
最新的2.0版本的Sharding-Jdbc版本,由于需要支持动态配置加载,所以最新的模块信息如下: |-sharding-jdbc |-sharding-jdbc-core |-api |-cons ...
- Uiautomator分类
分类中主要使用的类介绍!
- 从壹开始微服务 [ DDD ] 之九 ║从军事故事中,明白领域命令验证(上)
烽烟 哈喽大家周二好呀,咱们又见面了,上周末掐指一算,距离 圣诞节 只有 5 周的时间了(如果你还不知道为啥我要提圣诞节这个时间点,可以看看我的第二系列开篇<之一 ║ D3模式设计初探 与 我的 ...
- 零基础如何学Python爬虫技术?
在作者学习的众多编程技能中,爬虫技能无疑是最让作者着迷的.与自己闭关造轮子不同,爬虫的感觉是与别人博弈,一个在不停的构建 反爬虫 规则,一个在不停的破译规则. 如何入门爬虫?零基础如何学爬虫技术?那前 ...
- Electron学习笔记(一)
Electron是使用Javascript.HTML5技术构建跨平台桌面应用的技术,是目前非常活跃的一项技术,其中比较有名气的应用有微软的VS Code. 创建一个Electron应用的方式有很多,G ...
- Redis缓存穿透、缓存雪崩和缓存击穿理解
1.缓存穿透(不存在的商品访问数据造成压力) 缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并 ...
- 论JVM爆炸的几种姿势及自救方法
前言 如今不管是在面试还是在我们的工作中,OOM总是不断的出现在我们的视野中,所以我们有必要去了解一下导致OOM的原因以及一些基本的调整方法,大家可以通过下面的事例来了解一下什么样的代码会导致OOM, ...
- netcore服务程序暴力退出导致的业务数据不一致的一种解决方案(优雅退出)
一: 问题提出 现如今大家写的netcore程序大多部署在linux平台上,而且服务程序里面可能会做各种复杂的操作,涉及到多数据源(mysql,redis,kafka).成功部署成后台 进程之后,你以 ...
- 结合JDK源码看设计模式——装饰者模式
定义 在不改变原有对象的基础之上,将功能附加到对象上 适用场景 扩展一个类的功能 动态的给对象增加功能,当功能不需要的时候能够动态删除 详解 在看到定义的时候,可能很多人会想,这不就是继承吗?的确很像 ...
- 高通QCC3026蓝牙音频芯片处理器介绍
QCC3026是一款基于超低功耗架构的入门级闪存可编程蓝牙音频SoC,专为紧凑型功能优化的Qualcomm TrueWireless耳塞而设计.QCC3026旨在为我们的客户提供有助于缩短开发时间并具 ...