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 更新到特定版本
相关推荐
ChaITSimpleLove12 小时前
.NET 10 的 AI 技术栈全景:M.E.AI、MCP 与 Agent Framework 深度解析
人工智能·.net·ai agent·mcp·agent framework·m.e.ai·hosted agents
数据知道18 小时前
.NET 反序列化漏洞——ViewState 与 BinaryFormatter 实战深度剖析
网络·网络安全·.net
leonkay1 天前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发
界面开发小八哥1 天前
界面控件DevExpress WinForms中文帮助文档 - 将基于DevExpress的.NET Framework应用迁移至最新版.NET
ui·.net·界面控件·winform·devexpress·ui开发
人丰2 天前
血泪复盘:一次由 HttpContext.Current 引发的 CPU 100% 惨案
性能优化·.net
ChaITSimpleLove2 天前
用 .NET 10 技术栈 “玩转 AI 学习” 的路线图:从 Minimal API 到 AI Agent 产品
人工智能·.net·学习 ai
半亩码田3 天前
【.NET新特性·第14篇】.NET 10 运行时与 SDK 新特性
.net
祀爱3 天前
C# MQTT 连接服务
后端·c#·.net
足球中国4 天前
.net DataExcel控件 2.11.1.53版发布
c#·.net·excel
rockey6274 天前
C#脚本引擎之AScript与Jurassic、Jint对比
javascript·c#·.net·js·script·动态脚本