# 模块化开发平台

DarkM 不仅是一个框架,更是一个完整的模块化开发平台。本文介绍模块化设计理念,具体细节请参阅其他章节。


# 📦 核心概念

概念 说明 示例
模块 按业务/功能拆分的独立单元 Admin(权限)、Quartz(任务调度)、HumanResources(人事)
项目 由多个模块组成的完整产品 OA 系统、CMS 系统、商城系统
模块包 通过 NuGet/NPM 分发的模块 DarkM.Module.Admin.Webdarkm-module-admin

# 🆚 模块化 vs 微服务

对比项 微服务 DarkM 模块化
部署方式 独立部署 集成打包部署
通信方式 HTTP/RPC 直接调用
集成时机 运行时 开发阶段
运维成本
适用场景 大型分布式系统 中小型单体/模块化系统

DarkM 理念: 在开发阶段集成,在部署时统一,兼顾模块化与运维简便性。


# 🎯 模块化平台七大特点

# 1️⃣ 约定优于配置

原则: 统一约定减少决策成本,让开发者专注业务

# 项目结构约定

以 Quartz 模块为例,标准模块结构如下:

ModuleName/
├── build/                    # 编译打包配置
│   └── module.build.targets
├── Application/              # 应用服务层
│   ├── IService/
│   ├── Service/
│   └── Models/
├── Domain/                   # 领域层
│   ├── Entities/
│   ├── Repositories/
│   ├── ValueObjects/
│   └── Models/
├── Infrastructure/           # 基础设施层
│   ├── Repositories/
│   └── Configurations/
├── Quartz/                   # 任务调度层(可选)
│   └── Jobs/
├── Web/                      # 应用层
│   ├── Controllers/
│   ├── Validators/
│   └── Filters/
└── WebHost/                  # 启动器
    ├── config/
    └── Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 命名约定

类型 命名规则 示例
实体类 *Entity UserEntity, OrderEntity
应用服务接口 I*Service IUserService
应用服务实现 *Service UserService
模型映射配置 _MapperConfig.cs User_MapperConfig.cs
模型验证类 *Validator UserValidator
控制器 *Controller UserController

# 配置约定

{
  "Db": {
    "Modules": [
      {
        "Name": "Admin",
        "Database": "Nm_Admin",
        "Prefix": ""
      }
    ]
  }
}
1
2
3
4
5
6
7
8
9
10
11

# 2️⃣ 独立性与解耦

原则: 模块间低耦合,善用设计模式解决依赖

# 问题场景

会议模块需要员工信息,如何处理依赖?

// ❌ 强依赖:人员模块依赖会议模块
public class EmployeeService
{
    private readonly IMeetingService _meetingService; // 循环依赖!
}

// ✅ 观察者模式:解耦
public class EmployeeService
{
    private readonly IEntityObserverHandler _observerHandler;
    
    public async Task Add(EmployeeEntity entity)
    {
        await _repository.AddAsync(entity);
        await _observerHandler.Add<EmployeeEntity>(entity.Id);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 观察者模式实现

// 会议模块实现员工观察者
public class EmployeeObserver : IEntityObserver<EmployeeEntity>
{
    private readonly IMeetingStatisticsService _statisticsService;
    
    public async Task Add(dynamic id)
    {
        // 创建员工的会议统计信息
        await _statisticsService.CreateForEmployee(id);
    }
}
1
2
3
4
5
6
7
8
9
10
11

优势:

  • ✅ 人员模块无需知道会议模块存在
  • ✅ 新模块可自由添加观察者
  • ✅ 避免循环依赖

# 3️⃣ 灵活集成

原则: 任意模块组合,灵活部署

# 模块配置(appsettings.json)

{
  "Db": {
    "Modules": [
      { "Name": "Admin", "Database": "Nm_Admin" },
      { "Name": "Common", "Database": "Nm_Common" },
      { "Name": "Quartz", "Database": "Nm_Quartz" },
      { "Name": "HumanResources", "Database": "Nm_HR" },
      { "Name": "YourModule", "Database": "Nm_Your" }
    ]
  }
}
1
2
3
4
5
6
7
8
9
10
11

特点:

  • ✅ 按需选择模块
  • ✅ 每个模块独立数据库
  • ✅ 支持跨库查询

# 4️⃣ 便捷性

原则: 傻瓜式集成、打包、升级

# NuGet 包管理

# 安装模块
Install-Package DarkM.Module.Quartz.Web -Version 1.0.2

# 更新模块
Update-Package DarkM.Module.Quartz.Web
1
2
3
4
5

# NPM 包管理

# 安装前端模块
npm i -S darkm-module-quartz

# 更新前端模块
npm update darkm-module-quartz
1
2
3
4
5

# 5️⃣ 全面模块化

原则: 前后端统一模块化

# 后端集成

// WebHost/Program.cs
services.AddDarkM()
    .AddModule<AdminModule>()
    .AddModule<QuartzModule>()
    .AddModule<YourModule>();
1
2
3
4
5

# 前端集成

// main.js
import WebHost from 'darkm-module-admin'
import Quartz from 'darkm-module-quartz'
import YourModule from 'darkm-module-your'

WebHost.registerModule(Quartz)
WebHost.registerModule(YourModule)
WebHost.start(config)
1
2
3
4
5
6
7
8

# 6️⃣ 独立维护

原则: 每个模块独立仓库,版本化管理

# Git 仓库结构

framework/darkm/           # 核心框架
├── DarkM                  # 核心库
├── DarkM.UI               # 前端核心
└── DarkM.Module.*         # 工具模块

woowis/darkm/              # 业务模块
├── DarkM.Module.WorkFlow
├── DarkM.Module.HumanResources
└── DarkM.Module.Order

doterra/oa/                # 业务系统
├── Recipients             # 内领系统
├── doBOM                  # BOM 管理
└── Holiday                # 休假管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 7️⃣ 专注开发

原则: 开发者只需关注自己的模块

开发体验:

  • ✅ 无需了解其他模块实现
  • ✅ 遵循约定即可无缝集成
  • ✅ 代码生成器快速搭建框架
  • ✅ 完善的文档和示例

# 🏗️ 模块分层架构

┌─────────────────────────────────────────┐
│           WebHost (启动器)               │
│   - 模块注册                             │
│   - 配置加载                             │
│   - 应用启动                             │
└─────────────────────────────────────────┘
                    ↓
┌─────────────────────────────────────────┐
│             Web (应用层)                 │
│   - Controllers                          │
│   - Validators                           │
│   - Filters                              │
└─────────────────────────────────────────┘
                    ↓
┌─────────────────────────────────────────┐
│          Application (服务层)            │
│   - IService / Service                   │
│   - DTO / VO                             │
│   - 业务逻辑                             │
└─────────────────────────────────────────┘
                    ↓
┌─────────────────────────────────────────┐
│           Domain (领域层)                │
│   - Entities                             │
│   - Repositories (接口)                   │
│   - Value Objects                        │
└─────────────────────────────────────────┘
                    ↓
┌─────────────────────────────────────────┐
│       Infrastructure (基础设施层)        │
│   - Repositories (实现)                   │
│   - DbContext                            │
│   - 外部服务集成                          │
└─────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 🔗 相关文档


最后更新: 2022-08-07