📆 2026-01-27 15:39

模块化开发

模块是相对独立的业务功能单元,通常根据业务领域进行划分。模块化开发可以提升代码的可维护性和复用性。

模块必须以Mod后缀命名。

管理模块

通过studio中的模块管理界面,可以非常方便的创建和删除模块,工具会自动跨程序集处理模块相关的依赖关系。

模块目录

模块自身在src/Modules中,是一个独立的项目。通常包括:

  • Models: Dto模型
  • Managers: 业务逻辑
  • Services: 仅用于该模块的服务
  • ModuleExtensions.cs:模块的扩展方法,用于注册模块相关的服务。

Tip

源代码生成器会在服务中自动注入模块的扩展方法,无需手动调用。

模块的实体在src/Definition/Entity项目中,通过目录名称(模块命名)进行区分。

模块的复用

模块可以跨解决方案进行复用,如客户管理模块,订单管理模块等。工具提供了模块的打包和安装命令,方便模块的分发和使用。

打包模块

要进行包,需要编辑ModuleExtensions.cs文件,该文件在创建模块时自动生成,如:

public static class ModuleExtensions
{
    [DisplayName("Perigon::XXX")]
    [Description("注册 XXX 模块服务,包括密钥管理与 OAuth 核心逻辑")]
    public static IHostApplicationBuilder AddXXXMod(this IHostApplicationBuilder builder)
    {
        builder.AddModServices();
        return builder;
    }
    private static IHostApplicationBuilder AddModServices(this IHostApplicationBuilder builder)
    {
        // ...模块相关服务注册,如添加后台服务
        return builder;
    }
    // 自定义中间件注册,需要服务中手动调用
    public static WebApplication UseXXXModServices(this WebApplication app)
    {
        // ...模块相关中间件注册
        return app;
    }
}
  • [DisplayName]:用来表示作者名称和包的显示名,使用::分隔,如"Perigon::文件管理模块",如果没有发现::,则默认认为是作者名称,包显示名使用默认的模块名称。
  • [Description]:用来描述包的作用和特点。
  • AddXXXMod:模块的扩展方法,用来注册模块相关的服务,如果服务很多,可以拆分到私有方法AddModServices中。
  • UseXXXModServices:模块的中间件注册方法,需要在服务中手动调用才能生效。

Note

通常AddXXXMod只包含该模块特定的服务注册

进行打包的模块,要满足:

  • 实体控制器之外的代码都应该在模块项目中,如果引用了其他项目的代码,打包时会提示错误。

使用perigon pack <模块名称> <服务名称>命令进行打包,必须在项目根目录下执行,打包后将在根目录下生成package-modules目录,你可以看到打包生成的模块文件(zip格式)。

安装模块

请在项目根目录下执行:

perigon install <模块包路径> <服务名称>

安装完成后,重新加载解决方案,然后检查模块是否安装成功。