# 模块化开发平台
DarkM 不仅是一个框架,更是一个完整的模块化开发平台。本文介绍模块化设计理念,具体细节请参阅其他章节。
# 📦 核心概念
| 概念 | 说明 | 示例 |
|---|---|---|
| 模块 | 按业务/功能拆分的独立单元 | Admin(权限)、Quartz(任务调度)、HumanResources(人事) |
| 项目 | 由多个模块组成的完整产品 | OA 系统、CMS 系统、商城系统 |
| 模块包 | 通过 NuGet/NPM 分发的模块 | DarkM.Module.Admin.Web、darkm-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
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
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
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
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
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
2
3
4
5
# NPM 包管理
# 安装前端模块
npm i -S darkm-module-quartz
# 更新前端模块
npm update darkm-module-quartz
1
2
3
4
5
2
3
4
5
# 5️⃣ 全面模块化
原则: 前后端统一模块化
# 后端集成
// WebHost/Program.cs
services.AddDarkM()
.AddModule<AdminModule>()
.AddModule<QuartzModule>()
.AddModule<YourModule>();
1
2
3
4
5
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
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
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
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