本系列目录:Abp介绍和经验分享-目录

今天介绍下,如何使用T4根据json文件自动生成权限定义。

先看成果

成果是:

  1. 要新增一个权限定义时,打开Json文件,找到目标节点,加个权限定义;
  2. 生成下Core程序集(因为Json文件都是嵌入式资源文件);
  3. 跑一遍T4,ok,新增的权限名常量有了,权限树上也加了新权限。

截图:

开工

还是从Personball.Demo项目开始,我从dev分支新建了一个feature_t4_permissions

展开Personball.Demo.Core程序集,按下述步骤操作

安装包,获取相关文件

打开程序包管理器控制台,默认项目选中Personball.Demo.Core,执行如下命令,安装获取相关文件:

//安装过程中会提示是否执行T4,请取消,还有地方需要修改
Install-Package Abplus.T4.PermissionsFromJson

该nuget包带来如下几个文件:

  1. Authorization\Builders\Permissions\Sample.json
  2. Authorization\Builders\BuilderUtils.cs
  3. Authorization\Builders\PermissionBuilder.tt
  4. Authorization\Builders\T4MultipleOutputManager.ttinclude

几处修正

  1. 选中Sample.json,F4查看属性,确保json文件的属性是嵌入的资源
  2. 打开BuilderUtils.cs,将【YourCompany.YourProject】替换成Personball.Demo
  3. 打开PermissionBuilder.tt,将【YourCompany.YourProject】替换成Personball.Demo
  4. 打开PermissionBuilder.tt,修正你所使用的Newtonsoft.Json的引用路径(版本号)
  5. 打开Authorization\DemoAuthorizationProvider.cs,在SetPermissions方法中追加一行代码BuilderUtils.Build(context, "Sample");

其中SetPermissions方法中,可以注释掉原先的context.CreatePermission调用,然后针对每个权限定义json文件,增加代码:

//【Json文件名】替换,如Sample,无文件名后缀
BuilderUtils.Build(context, "【Json文件名】");

如果需要json文件的具体字段定义,请参考BuilderUtils.cs文件中PermissionJson类的定义。

Run

生成Core程序集,然后运行PermissionBuilder.tt(右键点击tt文件,运行自定义工具

清理

待所有AbpAuthorizeAttribute中用到的权限字符串常量(如标在TenantAppService上的[AbpAuthorize(PermissionNames.Pages_Tenants)])都替换成T4自动生成的以后,就可以删除Authorization目录下的PermissionNames.cs了。

同时可以清理DemoAuthorizationProviderSetPermissions方法中原有的代码,统一全部调用BuilderUtils.Build

感谢

感谢曾经的同事 @菜刀和板砖 提供本文关键实现。

最新文章

  1. 【转载】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
  2. net-snmp源码VS2013编译添加加密支持(OpenSSL)
  3. 环信SDK与Apple Watch的结合(2)
  4. c++实现两个文件的拼接。
  5. 内核映像的形成 —— KBuild体系
  6. JAVA中this用法小结[转]
  7. Sipdroid实现SIP(一): 注册
  8. AFNetworking 动态修改acceptableContentTypes 设置ContentType
  9. Django 学习笔记(六)MySQL配置
  10. 程序员的自我救赎---3.2:SSO及应用案例
  11. thinkphp5使用PHPExcel导入Excel数据
  12. POJ_1064 二分搜索
  13. 关于 Java 面试,你应该准备这些知识点
  14. 三,前端---JS最基本的创建对象的方法
  15. 安卓TV开发(十) 智能电视开发之在线视频直播
  16. VS 2017 创建类注释模板
  17. 2018.9青岛网络预选赛(B)
  18. Java开发各层对象专用名词含义 PO,VO,DAO,BO,DTO,POJO, BYO,Entity,JavaBean,JavaBeans
  19. Volley的Get、Post方式(JsonObjectRequest、StringRequest)以及Volley获取图片的3种方式
  20. RAC禁用DRM特性

热门文章

  1. ubuntu归档管理器消失了?
  2. td中内容自动换行
  3. ylb:了解存储过程
  4. BF3 里面的z cull reverse reload
  5. myeclipse执行tomcat报错Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
  6. Python批量复制和重命名文件
  7. C# Graphics
  8. 【Python】程序在运行失败时,一声不吭继续运行pass
  9. UIView属性的动画
  10. jdk并发工具包之锁