一、概述

有些功能在单个项目或多个项目被重复使用,比如:附件,同一个系统中的多个模块都可能使用到,不同项目也有需要。再比如:有无限级分类的树形功能,区域、产品分类、数据字典等。最简单粗暴的办法是直接复制代码,最后本来是同一个功能被复制了多份,而且可能最后都被各自修改得面目全非。
理想的办法是将这些通用功能封装起来,通过迭代升级版本,不同项目都可以引用他们,封装的时候留出扩展点方便每个项目的个性化需求

nuget中搜索bxjg可以找到已发布的模块,源码后续会放github上,猴急的你可以私我

本篇讲解如何使用,下篇讲如何通过abp提供的模块化能力实现一个通用树模块
注:ASP.NET Boilerplate简称abp,是个啥请百个度

二、如何使用

为了各位有个直观感受,我们来看看如何使用模块,后续再讲如何开发它。

2.1、基本使用

1、通过nuget安装通用树模块(最好是所有项目都安装 解决方案 -> 右键 管理解决方案的包 一次安装)

Install-Package BXJG.GeneralTree -Version 1.0.

2、配置DbContext

public class ABPDbContext : AbpZeroDbContext<Tenant, Role, User>{
    //其它配置
    public virtual DbSet<GeneralTreeEntity> GeneralTrees { get; set; }

3、开启动动态webApi代理生成

public class ABPWebApiModule : AbpModule {
  public override void Initialize() {
    //other..
    Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
    .ForAll<IApplicationService>(typeof(GeneralTreeModule).Assembly, "gt/gt")
    .Build();

4、数据库迁移
add-migration addGeneralTree
update-database

此时编译调试,如果你有swaggerUI的话,应该可以看得到生成的动态webapi了

5、配置权限,在core项目的AuthorizationProvider中

public class ABPAuthorizationProvider : AuthorizationProvider{
  GeneralTreeModuleConfig cfg;//注入模块的配置对象
  public ABPAuthorizationProvider(GeneralTreeModuleConfig cfg) {
    this.cfg = cfg;
  }
  public override void SetPermissions(IPermissionDefinitionContext context){
    //其它权限的配置
    cfg.InitPermission(baseInfo);//通用字典权限的配置

6、配置菜单,配置方式跟权限配置类似。在web项目中的NavigationProvider

public class ABPNavigationProvider : NavigationProvider{
  GeneralTreeModuleConfig cfg;
  public ABPNavigationProvider(GeneralTreeModuleConfig cfg){
  this.cfg = cfg;
  }
  public override void SetNavigation(INavigationProviderContext context){
    //其它菜单配置
    var sjzd = cfg.InitNav(jczl);
    sjzd.Icon = "shuju";
    sjzd.Url = "/baseinfo/generalTree/index.html";

此时你已经可用在项目中使用这个通用的数据字典模块了

2.2、扩展通用字典实现“区域”功能

1、定义实体,继承模块提供的抽象类

[Table("ABPAdministratives")]
public class AdministrativeEntity : GeneralTreeEntity<AdministrativeEntity>{
  /// <summary>
  /// 行政区域级别
  /// </summary>
  public XZQ Level { get; set; }
}

2、配置DbContext

public class ABPDbContext : AbpZeroDbContext<Tenant, Role, User>{
//其它配置
public virtual DbSet<AdministrativeEntity> Administratives { get; set; }

3、定义领域服务类

public class AdministrativeManager : GeneralTreeManager<AdministrativeEntity>{
  public AdministrativeManager(IRepository<AdministrativeEntity, long> repository) : base(repository){
  }
}

4、按abp常规套路实现Application中的接口和dto,偷个懒,截个图

[AutoMapFrom(typeof(AdministrativeEntity))]
public class AdministrativeDto : GeneralTreeGetTreeNodeBaseDto<AdministrativeDto> {
  public XZQ Level { get; set; }
  public string LevelText { get; set; }
}
[AutoMapTo(typeof(AdministrativeEntity))]
public class EditAdministrativetDto: GeneralTreeNodeEditBaseDto{
  [Range(, )]
  public int Level { get; set; }
} public interface IAdministrativeAppService : IGeneralTreeAppServiceBase<AdministrativeDto,EditAdministrativetDto>
{} public class AdministrativeAppService : GeneralTreeAppServiceBase<AdministrativeEntity, AdministrativeDto, EditAdministrativetDto>, IAdministrativeAppService{
  public AdministrativeAppService(
    IRepository<AdministrativeEntity, long> repository,
    AdministrativeManager organizationUnitManager)
    : base(repository,
      organizationUnitManager,
      PermissionNames.AdministratorBaseInfoAdministrativeAdd,
      PermissionNames.AdministratorBaseInfoAdministrativeUpdate,
      PermissionNames.AdministratorBaseInfoAdministrativeDelete,
      PermissionNames.AdministratorBaseInfoAdministrative,
      "Nationwide", "Administrative")
    {}   protected override void OnGetAllListItem(AdministrativeEntity entity, AdministrativeDto dto){
    dto.LevelText = base.LocalizationSource.GetEnum(entity.Level);
  }   protected override void OnGetForSelectItem(AdministrativeEntity entity, GeneralTreeNodeDto node){
    node.attributes.Level = entity.Level;
    node.attributes.LevelText = base.LocalizationSource.GetEnum(entity.Level);
  }

三、总结
本篇只讲了使用,下篇会详细分析如何用abp实现模块化

abp模块化开发之通用树1:基本使用的更多相关文章

  1. asp.net abp模块化开发之通用树2:设计思路及源码解析

    一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...

  2. 初识ABP vNext(9):ABP模块化开发-文件管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 创建模块 模块开发 应用服务 运行模块 单元测试 模块使用 最后 前言 在之前的章节中介绍过ABP扩展实体,当时在用户 ...

  3. Android模块化开发实践

    一.前言 随着业务的快速发展,现在的互联网App越来越大,为了提高团队开发效率,模块化开发已经成为主流的开发模式.正好最近完成了vivo官网App业务模块化改造的工作,所以本文就对模块化开发模式进行一 ...

  4. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

  5. ABP模块化

    基于Abp模块化.插件化的设计,开发人员可以将自定义的功能以模块的形式集成到项目中. 模块的加载 模块: 插件: 模块及插件的加载路线: 1. 扩展的HttpApplication对象(在Abp.We ...

  6. 详解JavaScript模块化开发

    什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...

  7. Asp.net Mvc模块化开发之分区扩展框架

    对于一个企业级项目开发,模块化是非常重要的. 默认Mvc框架的AreaRegistration对模块化开发真的支持很好吗?真的有很多复杂系统在使用默认的分区开发的吗?我相信大部分asp.net的技术团 ...

  8. JavaScript模块化开发&&模块规范

    在做项目的过程中通常会有一些可复用的通用性功能,之前的做法是把这个功能抽取出来独立为一个函数统一放到commonFunctions.js里面(捂脸),实现类似于snippets的代码片段收集. fun ...

  9. js模块化开发——前端模块化

    在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可:如今CPU.浏览器性能得到了极大的提升,很多页面逻辑迁移到了客 户端(表单验证等),随着web2.0时代的到来,Ajax技术 ...

随机推荐

  1. 《HelloGitHub》第 44 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  2. 如何配置tomcat的环境变量

    如何配置tomcat的环境变量 安装好tomcat之后, 按照这个操作,计算机→属性→高级系统设置→高级→环境变量,打开环境变量设置框. 以本人的tomcat 8.0为例:安装下来如图 那么我的tom ...

  3. 2019-9-28:渗透测试,基础学习,pgp常量,逻辑运算,DNS投毒,笔记

    sunny.exe clientid 隧道ID route -n 查看网关netstat -rn 查看网关 DNS劫持ettercap用来内网渗透测试使用,可以嗅探内网,DNS劫持等攻击1,在攻击者电 ...

  4. java之初见

    1.Java语言的了解: Java语言最早是由SUN公司创造出来的,1991年,SUN公司的green项目,Oak,随后SUN公司和后来的甲骨文公司又先后发布了java1.0,1.1,1.2,1.3, ...

  5. java.lang.IllegalArgumentException: A null value cannot be assigned to a primitive type

    今天做项目测试接口,查询数据时出现以下错误,记录一下. 查询语句和错误信息: 实体类属性 原因是 由于字段 total和receive 在实体类中使用的是 int类型,但是数据库中查询出来的数据为nu ...

  6. Dockerfile构建私有镜像

    构建第一个镜像 镜像的定制实际上就是定制每一层所添加的配置,文件.我们可以把每一层修改,安装,构建,操作的命令都写入一个脚本,这个脚本就是Dockerfile.Dockerfile是一个文本文件,其内 ...

  7. kube-apiserver 集群服务安装

    目录 创建 kube-apiserver 证书 生成证书和私钥 创建加密配置文件 创建审计策略文件 分发 kube-apiserver 二进制文件 创建后续访问 metrics-server 使用的证 ...

  8. postgresql密码加强-passwordcheck源码修改三种以上字符

    目录 1.使用方式 2.效果 3.源码修改 1.参考pg_cron的源码在配置文件内增加一个参数 2.修改源码配置校验数字 因数据库入网检测须修改密码级别,在源有的passwordcheck插件上进行 ...

  9. 华为云 AI 实战营计划,带你迈上 AI 之路

    当今,AI的开发人才需求呈现极大的供需不平衡.所有开发者都关心,要如何从一名开发者晋升为AI开发者?AI开发能力,是主要的进入障碍.不用慌,华为云推出了 <华为云ModelArts-Lab AI ...

  10. 转:Connection reset原因分析和解决方案

    在使用HttpClient调用后台resetful服务时,“Connection reset”是一个比较常见的问题,有同学跟我私信说被这个问题困扰很久了,今天就来分析下,希望能帮到大家.例如我们线上的 ...