Skip to content

EasyAbp/Abp.Trees

Repository files navigation

Abp.Trees

ABP version NuGet NuGet Download Discord online GitHub stars

An abp module that provides standard tree structure entity implement.

Installation

  1. Install the following NuGet packages. (see how)

    • EasyAbp.Abp.Trees.Domain
    • EasyAbp.Abp.Trees.Domain.Shared
    • EasyAbp.Abp.Trees.EntityFrameworkCore
  2. Add DependsOn(typeof(AbpTreesXxxModule)) attribute to configure the module dependencies. (see how)

Usage

  1. Create a entity and implement ITree<TEntity>.

  2. Create a Repository for the entity. EfCoreTreeRepository<TDbContext, TEntity> override some function of EfCoreRepository<TDbContext, TEntity, TKey> to match tree structure:

    • InsertAsync :Auto Append node Code and Calc Level property when insert

    • UpdateAsync :Auto Move node when update a Entity that parentId is modified

    • DeleteAsync :Also delete Children nodes

  3. You have two ways to use this Repository

    • Way 1 : Default Repository(ITreeRepository<>),
      Add context.Services.AddTreeRepository<MyProjectNameDbContext>(); to ConfigureServices method in MyProjectNameEntityFrameworkCoreModule.cs.

    • Way 2 : Create a CustomRepository that base on EfCoreTreeRepository<TDbContext, TEntity>

    • Example:

    context.Services.AddAbpDbContext<TestDbContext>(options =>
    {
    	options.AddDefaultRepositories(includeAllEntities: true);//add Abp's `IRepository<TEntity>`
    	options.AddDefaultTreeRepositories();//add `ITreeRepository<TEntity>` for all Entity with implement `ITree<TEntity>`
    	options.TreeEntity<Resource>(x => x.CodeLength = 10);//set CodeLength for each Entity(Default:5)
    });

CheckPoints

1.Check the module DependsOn(typeof(AbpTreesXxxModule)) dependencies are config

XxxEntityFrameworkCoreModule, XxxDomainSharedModule, XxxDomainModule

2.Check IYourRepository : ITreeRepository<YourEntity>

3.Be sure YourEntity:XxxEntity<Guid>,ITree<YourEntity>

4.Be sure XxxEntityFrameworkCoreModule has config options.AddDefaultTreeRepositories();

Sample

It works fine with Volo.Abp.Application.Services.CrudAppService.

After replacing IRepository<> with ITreeRepository<Domain.OrganizationUnit>, the repository will handle the tree structure of the entity during creating, updating, and deleting.

    public class OrganizationUnitAppService:
        Volo.Abp.Application.Services.CrudAppService<
            Domain.OrganizationUnit, Application.OrganizationUnitDto,
            Application.OrganizationUnitDto,Guid, Volo.Abp.Application.Dtos.IPagedAndSortedResultRequest,
            Application.CreateOrganizationUnitDto,Application.UpdateOrganizationUnitDto>,
        IOrganizationUnitAppService
        
    {
        public OrganizationUnitAppService(
            EasyAbp.Abp.Trees.ITreeRepository<Domain.OrganizationUnit> organizationUnitRepository
            ):base(organizationUnitRepository)
        {
            
        }

    }

Roadmap

  • Widget of tree operation for MVC UI.
  • Create a TreeManager to provides more function,example: Sort(reassigned code), Ui Pagination...
  • More Unit tests.