abp模塊化開發之通用樹1:基本使用


一、概述

有些功能在單個項目或多個項目被重復使用,比如:附件,同一個系統中的多個模塊都可能使用到,不同項目也有需要。再比如:有無限級分類的樹形功能,區域、產品分類、數據字典等。最簡單粗暴的辦法是直接復制代碼,最后本來是同一個功能被復制了多份,而且可能最后都被各自修改得面目全非。
理想的辦法是將這些通用功能封裝起來,通過迭代升級版本,不同項目都可以引用他們,封裝的時候留出擴展點方便每個項目的個性化需求

nuget中搜索bxjg可以找到已發布的模塊,源碼后續會放github上,猴急的你可以私我

本篇講解如何使用,下篇講如何通過abp提供的模塊化能力實現一個通用樹模塊
注:ASP.NET Boilerplate簡稱abp,是個啥請百個度

 

 

 

 

 

 

 

二、如何使用

為了各位有個直觀感受,我們來看看如何使用模塊,后續再講如何開發它。

2.1、基本使用

1、通過nuget安裝通用樹模塊(最好是所有項目都安裝 解決方案 -> 右鍵 管理解決方案的包 一次安裝)

Install-Package BXJG.GeneralTree -Version 1.0.1


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(0, 3)]   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實現模塊化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM