# 会话实体设计
**本文档引用的文件**
- [ChatMessage.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/ChatMessage.cs)
- [UserChatCard.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs)
- [MessageStore.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs)
- [UserChatFriend.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriend.cs)
- [MessageType.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs)
- [MessageSourceType.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSourceType.cs)
- [UserOnlineState.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/UserOnlineState.cs)
- [UserFriendStatus.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriendStatus.cs)
## 目录
1. [简介](#简介)
2. [会话实体字段定义](#会话实体字段定义)
3. [会话类型设计](#会话类型设计)
4. [会话生命周期管理](#会话生命周期管理)
5. [会话与消息关联关系](#会话与消息关联关系)
6. [会话成员管理](#会话成员管理)
7. [会话元数据存储](#会话元数据存储)
8. [性能优化策略](#性能优化策略)
9. [会话功能扩展指导](#会话功能扩展指导)
10. [结论](#结论)
## 简介
本文档详细说明了实时消息模块中会话实体的设计与实现。系统通过`ChatMessage`实体表示消息会话,支持单聊、群聊等多种会话类型,并提供了完整的会话生命周期管理机制。会话实体与用户卡片、好友关系等元数据紧密关联,形成了完整的实时通信解决方案。
**文档来源**
- [ChatMessage.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/ChatMessage.cs)
- [UserChatCard.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs)
## 会话实体字段定义
会话实体主要由`ChatMessage`类定义,包含以下核心字段:
| 字段名称 | 数据类型 | 约束条件 | 业务规则 |
|---------|--------|---------|---------|
| TenantId | Guid? | 可为空 | 租户标识,支持多租户架构 |
| GroupId | string | 可为空 | 群组标识,为空表示单聊会话 |
| MessageId | string | 必填 | 消息唯一标识,由系统自动生成 |
| FormUserId | Guid | 必填 | 发送者用户标识 |
| FormUserName | string | 必填 | 发送者用户名 |
| ToUserId | Guid? | 可为空 | 接收用户标识,群聊时可为空 |
| Content | string | 必填 | 消息内容,不进行审计记录 |
| SendTime | DateTime | 必填 | 消息发送时间,使用系统时钟 |
| IsAnonymous | bool | 必填 | 是否匿名发送,存储在扩展字段中 |
| MessageType | MessageType | 必填 | 消息类型,默认为文本消息 |
| Source | MessageSourceType | 必填 | 消息来源,默认为用户发送 |
**会话实体字段定义来源**
- [ChatMessage.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/ChatMessage.cs#L15-L60)
## 会话类型设计
系统支持多种会话类型,通过`MessageType`和`MessageSourceType`枚举进行区分:
```mermaid
classDiagram
class MessageType {
+Text = 0
+Image = 10
+Link = 20
+Video = 30
+Voice = 40
+File = 50
+Notifier = 100
}
class MessageSourceType {
+User = 0
+System = 10
}
class ChatMessage {
+MessageType MessageType
+MessageSourceType Source
+string GroupId
}
ChatMessage --> MessageType : "has"
ChatMessage --> MessageSourceType : "has"
```
**会话类型设计来源**
- [MessageType.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs#L2-L35)
- [MessageSourceType.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSourceType.cs#L2-L8)
- [ChatMessage.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/ChatMessage.cs#L59-L61)
## 会话生命周期管理
会话的创建、更新和关闭通过`MessageStore`服务进行管理,完整的生命周期流程如下:
```mermaid
sequenceDiagram
participant Client as "客户端"
participant MessageSender as "MessageSender"
participant EventBus as "分布式事件总线"
participant MessageStore as "MessageStore"
participant Repository as "消息存储库"
Client->>MessageSender : SendMessageAsync(chatMessage)
MessageSender->>MessageSender : 生成MessageId
MessageSender->>EventBus : PublishAsync(RealTimeEto)
EventBus->>MessageStore : HandleEventAsync(eventData)
MessageStore->>MessageStore : 消息拦截处理
MessageStore->>Repository : StoreMessageAsync(message)
Repository->>Repository : 根据GroupId判断单聊/群聊
Repository->>Repository : 保存消息到数据库
Repository-->>MessageStore : 保存成功
MessageStore-->>EventBus : 处理完成
EventBus-->>MessageSender : 事件处理完成
MessageSender-->>Client : 返回MessageId
```
**会话生命周期管理来源**
- [MessageSender.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSender.cs#L20-L33)
- [ChatMessageEventHandler.cs](file://aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/EventBus/Distributed/ChatMessageEventHandler.cs#L32-L60)
- [MessageStore.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs#L39-L77)
## 会话与消息关联关系
会话实体与消息存储之间存在紧密的关联关系,通过`MessageStore`服务实现消息的持久化和查询:
```mermaid
erDiagram
CHAT_MESSAGE {
string MessageId PK
guid FormUserId FK
guid? ToUserId FK
string? GroupId FK
string Content
datetime SendTime
int MessageType
int Source
guid? TenantId
}
USER_CHAT_CARD {
long Id PK
guid UserId UK
string UserName
int Sex
string NickName
string AvatarUrl
datetime? Birthday
int Age
guid? TenantId
}
USER_CHAT_FRIEND {
long Id PK
guid UserId FK
guid FrientId FK
bool Black
bool DontDisturb
bool SpecialFocus
string RemarkName
byte Status
guid? TenantId
}
CHAT_MESSAGE ||--o{ USER_CHAT_CARD : "发送者"
CHAT_MESSAGE }o--|| USER_CHAT_CARD : "接收者"
CHAT_MESSAGE }o--|| USER_CHAT_GROUP : "群组"
USER_CHAT_CARD ||--o{ USER_CHAT_FRIEND : "好友关系"
```
**会话与消息关联关系来源**
- [ChatMessage.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/ChatMessage.cs)
- [UserChatCard.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs)
- [UserChatFriend.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriend.cs)
## 会话成员管理
会话成员管理通过`UserChatCard`和`UserChatFriend`实体实现,包含用户基本信息和好友关系管理:
```mermaid
classDiagram
class UserChatCard {
+Guid? TenantId
+Guid UserId
+string UserName
+Sex Sex
+string NickName
+string AvatarUrl
+DateTime? Birthday
+int Age
+DateTime? LastOnlineTime
+UserOnlineState State
+SetBirthday(birthday, clock)
+SetAvatarUrl(url)
+ChangeState(clock, state)
+ToUserCard()
}
class UserChatFriend {
+Guid? TenantId
+Guid UserId
+Guid FrientId
+bool IsStatic
+bool Black
+bool DontDisturb
+bool SpecialFocus
+string RemarkName
+string Description
+UserFriendStatus Status
+SetStatus(status)
}
class UserOnlineState {
+Online
+Offline
+Busy
+Stealth
}
class UserFriendStatus {
+NeedValidation
+Added
+Blocked
}
UserChatCard --> UserOnlineState : "has"
UserChatFriend --> UserFriendStatus : "has"
UserChatCard --> UserChatFriend : "has many"
```
**会话成员管理来源**
- [UserChatCard.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs#L15-L118)
- [UserChatFriend.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriend.cs#L15-L83)
- [UserOnlineState.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/UserOnlineState.cs#L2-L10)
- [UserFriendStatus.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriendStatus.cs#L2-L15)
## 会话元数据存储
会话元数据存储设计包含用户卡片、好友关系和群组信息,确保会话上下文的完整性:
### 用户卡片表 (AppUserChatCards)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| Id | bigint | PK, AI | 主键 |
| TenantId | uniqueidentifier | NULL | 租户标识 |
| UserId | uniqueidentifier | NOT NULL | 用户标识 |
| UserName | nvarchar(256) | NOT NULL | 用户名 |
| Sex | int | NOT NULL | 性别 |
| NickName | nvarchar(256) | NULL | 昵称 |
| Sign | nvarchar(30) | NULL | 签名 |
| AvatarUrl | nvarchar(max) | NULL | 头像地址 |
| Birthday | datetime2 | NULL | 生日 |
| Age | int | NOT NULL | 年龄 |
| LastOnlineTime | datetime2 | NULL | 最后在线时间 |
| State | int | NOT NULL | 在线状态 |
### 好友关系表 (AppUserChatFriends)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| Id | bigint | PK, AI | 主键 |
| TenantId | uniqueidentifier | NULL | 租户标识 |
| UserId | uniqueidentifier | NOT NULL | 用户标识 |
| FrientId | uniqueidentifier | NOT NULL | 好友标识 |
| IsStatic | bit | NOT NULL | 是否系统预置 |
| Black | bit | NOT NULL | 是否黑名单 |
| DontDisturb | bit | NOT NULL | 是否免打扰 |
| SpecialFocus | bit | NOT NULL | 是否特别关注 |
| RemarkName | nvarchar(256) | NULL | 备注名称 |
| Description | nvarchar(50) | NULL | 附加说明 |
| Status | smallint | NOT NULL | 好友状态 |
**会话元数据存储来源**
- [UserChatCard.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs)
- [UserChatFriend.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriend.cs)
- [20250409030245_Initial-Single-Project-MSSQL.cs](file://aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/Migrations/20250409030245_Initial-Single-Project-MSSQL.cs#L1064-L1085)
## 性能优化策略
系统采用多种性能优化策略来提升会话处理效率:
### 会话缓存机制
```mermaid
flowchart TD
A[消息发送请求] --> B{是否需要缓存?}
B --> |是| C[检查缓存中是否存在会话]
C --> D{缓存命中?}
D --> |是| E[从缓存获取会话信息]
D --> |否| F[从数据库加载会话信息]
F --> G[存入缓存]
G --> H[处理消息]
B --> |否| H
H --> I[持久化消息]
I --> J[发布消息事件]
J --> K[通知在线用户]
```
### 批量处理优化
- **消息批量存储**:通过`StoreMessageAsync`方法实现消息的批量存储
- **事务管理**:使用`IUnitOfWorkManager`确保数据一致性
- **异步处理**:所有消息处理操作均采用异步模式
### 分布式事件驱动
系统采用分布式事件总线实现消息的异步处理,解耦消息发送与持久化逻辑,提高系统吞吐量。
**性能优化策略来源**
- [MessageStore.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs#L39-L77)
- [ChatMessageEventHandler.cs](file://aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/EventBus/Distributed/ChatMessageEventHandler.cs#L32-L60)
- [MessageSender.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSender.cs#L20-L33)
## 会话功能扩展指导
为开发人员提供会话功能扩展的指导建议:
### 支持临时会话
```csharp
// 创建临时会话的工厂方法
public static ChatMessage Temporary(
Guid formUserId,
string formUserName,
Guid toUserId,
string content,
IClock clock,
Guid? tenantId = null)
{
return new ChatMessage
{
FormUserId = formUserId,
FormUserName = formUserName,
ToUserId = toUserId,
Content = content,
SendTime = clock.Now,
IsAnonymous = false,
MessageType = MessageType.Text,
TenantId = tenantId,
Source = MessageSourceType.User,
}.SetProperty("Temporary", true);
}
```
### 支持系统通知会话
```csharp
// 系统通知会话的工厂方法
public static ChatMessage SystemNotification(
Guid formUserId,
Guid toUserId,
string content,
IClock clock,
Guid? tenantId = null)
{
return new ChatMessage
{
FormUserId = formUserId,
FormUserName = "system",
ToUserId = toUserId,
Content = content,
SendTime = clock.Now,
IsAnonymous = false,
MessageType = MessageType.Notifier,
TenantId = tenantId,
Source = MessageSourceType.System,
}.SetProperty("Priority", "High");
}
```
### 扩展建议
1. **敏感词过滤**:在`MessageBlocker.InterceptAsync`方法中扩展敏感词过滤逻辑
2. **消息加密**:在`ExtraProperties`中添加消息加密标识和密钥信息
3. **消息撤回**:添加消息撤回状态和时间戳到`ExtraProperties`
4. **消息已读**:通过`ExtraProperties`跟踪消息已读状态
**会话功能扩展指导来源**
- [ChatMessage.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/ChatMessage.cs#L78-L234)
- [MessageStore.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs#L39-L77)
## 结论
本文档详细介绍了实时消息模块中会话实体的设计与实现。系统通过`ChatMessage`实体统一管理单聊和群聊会话,结合`UserChatCard`和`UserChatFriend`实体实现完整的会话成员管理。采用分布式事件驱动架构,确保消息处理的高效性和可靠性。通过合理的元数据存储设计和性能优化策略,为实时通信功能提供了坚实的基础。开发人员可以根据业务需求,通过扩展`ExtraProperties`和添加新的工厂方法来支持临时会话和系统通知会话等高级功能。