18 ABP Framework 模块管理

ABP Framework 模块管理

概述

该页面详细介绍了在 ABP Framework 解决方案中使用 ABP CLI 及相关工具添加、更新和管理模块的方法。模块管理是 ABP 模块化架构的核心,支持可重用业务和基础设施功能的集成。模块通常以 NuGet 和/或 NPM 包的形式分发,有时也以源代码形式提供。

ABP CLI 模块管理命令

命令 描述
abp add-module 向解决方案添加多包模块
abp update 更新模块和 ABP 包版本
abp list-modules 列出可用的官方 ABP 模块

模块添加流程

模块添加由 SolutionModuleAdder 类和 abp add-module 命令协调完成,流程如下:
Yes No Yes No abp add-module (AddModuleCommand.ExecuteAsync) SolutionModuleAdder.GetModuleInfoAsync SolutionModuleAdder.RemoveIncompatiblePackages ProjectFinder.GetProjectFiles SolutionModuleAdder.AddNugetAndNpmReferences withSourceCode? SolutionModuleAdder.DownloadSourceCodesToSolutionFolder SolutionModuleAdder.AddAngularPackages SolutionModuleAdder.RemoveUnnecessaryProjectsAsync addSourceCodeToSolutionFile? SolutionFileModifier.AddModuleToSolutionFileAsync NugetPackageToLocalReferenceConverter.Convert SolutionModuleAdder.AddAngularSourceCode SolutionModuleAdder.RunBundleForBlazorAsync SolutionModuleAdder.ModifyDocContent Module added

abp add-module 命令

  • 语法abp add-module <module-name> [options]

  • 关键选项

    • --new:创建专用于解决方案的新模块
    • --with-source-code:下载模块源代码到解决方案
    • --add-to-solution-file:将下载的模块添加到解决方案文件
    • -s, --solution:明确指定解决方案文件
    • --skip-db-migrations:跳过数据库迁移创建
    • -v, --version:指定模块版本(默认为项目的 ABP 版本)
  • 示例

    复制代码
    abp add-module Volo.Blogging                       # 向当前解决方案添加 Blogging 模块
    abp add-module Volo.Blogging -s Acme.BookStore     # 向指定解决方案添加模块
    abp add-module ProductManagement --new             # 创建名为 ProductManagement 的新模块

模块结构与目标项目解析

添加模块时,ABP 基于 NuGetPackageTarget 和项目命名约定确定解决方案中哪些项目应接收每个包:
NugetPackageInfo.Target=Application *.Application.csproj NugetPackageInfo.Target=ApplicationContracts *.Application.Contracts.csproj NugetPackageInfo.Target=Domain *.Domain.csproj NugetPackageInfo.Target=DomainShared *.Domain.Shared.csproj NugetPackageInfo.Target=HttpApi *.HttpApi.csproj NugetPackageInfo.Target=HttpApiClient *.HttpApi.Client.csproj NugetPackageInfo.Target=EntityFrameworkCore *.EntityFrameworkCore.csproj NugetPackageInfo.Target=MongoDB *.MongoDB.csproj NugetPackageInfo.Target=Blazor *.Blazor.csproj NugetPackageInfo.Target=Web *.Web.csproj

目标解析逻辑

ProjectFinder.FindNuGetTargetProjectFile 方法用于解析哪个项目接收每个包:
Yes No NugetPackageInfo.Target ProjectFinder.FindNuGetTargetProjectFile Project file exists? Add package reference Skip package

例如,目标为 EntityFrameworkCore 的包会映射到以 .EntityFrameworkCore.csproj 结尾的项目。

添加带源代码的模块

使用 --with-source-code--new 选项时,模块源代码会下载到 /modules 文件夹并设置项目引用:
Yes No abp add-module --with-source-code SolutionModuleAdder.DownloadSourceCodesToSolutionFolder SolutionModuleAdder.RemoveUnnecessaryProjectsAsync NugetPackageToLocalReferenceConverter.Convert addSourceCodeToSolutionFile? SolutionFileModifier.AddModuleToSolutionFileAsync End

此方法推荐用于:

  • 自定义或扩展模块代码
  • 调试模块内部
  • 审查模块实现

数据库集成

如果添加的模块包含实体,ABP 会:

  • 定位应用程序的 DbContext
  • DbContext 添加模块的配置方法
  • 创建新的 EF Core 迁移(除非跳过)
  • 运行迁移程序项目(如果可用)

No Yes Yes No Module added module.EfCoreConfigureMethodName exists? End DerivedClassFinder.Find(dbMigrationsProject, 'AbpDbContext') DbContextFileBuilderConfigureAdder.Add skipDbMigrations? EfCoreMigrationManager.AddMigration SolutionModuleAdder.RunMigrator

创建数据库迁移

模块添加器将:

  1. 在应用程序中找到 DbContext
  2. 使用模块的 Configure{ModuleName} 方法添加必要的实体配置
  3. 创建名为 Added_{ModuleName}_Module 的新迁移
  4. 运行迁移程序(如果可用)

客户端集成

模块可能包含用于 Angular、Blazor 或 MVC 的客户端包,模块添加器会自动集成它们:
Found Not found Found Not found Detect Angular NPM packages ProjectNpmPackageAdder.AddNpmPackageAsync Skip SolutionModuleAdder.TryConfigureModuleConfigurationsForAngular Detect Blazor NuGet packages ProjectNugetPackageAdder.AddAsync Skip SolutionModuleAdder.RunBundleForBlazorAsync

Angular 集成

包括:

  • 安装 NPM 包(ProjectNpmPackageAdder.AddNpmPackageAsync
  • 修改 app.module.tsapp-routing.module.ts 以注册模块(SolutionModuleAdder.TryConfigureModuleConfigurationsForAngular
  • 按需添加源代码

Blazor 集成

包括:

  • 将 NuGet 包添加到 Blazor 项目
  • 运行捆绑命令生成静态资源(SolutionModuleAdder.RunBundleForBlazorAsync

更新模块

要更新解决方案中所有与 ABP 相关的 NuGet 和 NPM 包,请使用:

复制代码
abp update

更新流程

abp update (UpdateCommand.ExecuteAsync) Find .sln files For each solution VoloNugetPackagesVersionUpdater.UpdateSolutionAsync NpmPackagesUpdater.Update Done

选项

选项 描述
--npm 仅更新 NPM 包
--nuget 仅更新 NuGet 包
--check-all 单独检查每个包版本
-v, --version 更新到特定版本
相关推荐
咕白m62524 分钟前
C# 将 Excel 转为 CSV 的高效解决方案
.net
追逐时光者19 小时前
精选 5 款 .NET 开源、功能强大的工作流系统,告别重复造轮子!
后端·.net
专注VB编程开发20年21 小时前
c#,vb.net全局多线程锁,可以在任意模块或类中使用,但尽量用多个锁提高效率
java·前端·数据库·c#·.net
岩屿21 小时前
.NET 应用程序 Linux下守护进程脚本编写
linux·运维·服务器·c#·.net
一枚小小程序员哈1 天前
基于C#、.net、asp.net的心理健康咨询系统设计与实现/心理辅导系统设计与实现
c#·asp.net·.net
时光追逐者2 天前
C#/.NET/.NET Core技术前沿周刊 | 第 49 期(2025年8.1-8.10)
c#·.net·.netcore
喵叔哟2 天前
42.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成认证(一)
运维·微服务·.net
fs哆哆2 天前
在VB.net中,委托Action和Func,结合LINQ和Lambda表达式的应用
c#·.net·linq
唐青枫2 天前
C#.NET CancellationToken 深入与实战
c#·.net