浅谈 “ 站内信 ” 的实现
最近一直在写站内信模块,现在想好好总结一下。和大家一起学习交流。
之前看过,AlphaThink 写的 “两年后 再议站内信”。个人感觉写的很不错的。但是我们的网站没有那么多的访问量,所以,群发采用的是全部持久化到数据库。站内信发送类型包括 分为 ①点到点 ②点到局部 ③点到全部。
我们的网站采用的是领域驱动设计,下面我主要介绍应用层DTO 和提供的Service 设计
LetterDTO
/// <summary> /// 站内信标识。 /// </summary> public Guid Id { get; set; } /// <summary> /// 站内信标题。 /// </summary> public string Title { get; set; } /// <summary> /// 站内信内容。 /// </summary> public string Content { get; set; } /// <summary> /// 发信人。 /// </summary> public Guid SenderId { get; set; } /// <summary> /// 发件人关联用户实体。 /// </summary> public UserDTO Sender { get; set; } /// <summary> /// 站内信类别。 /// </summary> public LetterAppTypes LetterAppType { get; set; } /// <summary> /// 发件人是否删除。 /// </summary> public bool IsDelete { get; set; } /// <summary> /// 站内信是否置顶。 /// </summary> public bool IsTop { get; set; } /// <summary> /// 收件人集合。 /// </summary> public List<LetterReceiverDTO> Receivers{ get; set; } /// <summary> /// 发送时间。 /// </summary> public DateTime SendTime { get; set; }
LetterReceiverDTO
/// <summary> /// 收件人标识。 /// </summary> public Guid Id { get; set; } /// <summary> /// 收件人关联站内信标识。 /// </summary> public Guid LetterId { get; set; } /// <summary> /// 收件人Id。 /// </summary> public Guid ReceiverId { get; set; } /// <summary> /// 收件人关联用户实体。 /// </summary> public UserDTO Receiver { get; set; } /// <summary> /// 收件人是否读取。 /// </summary> public bool IsRead { get; set; } /// <summary> /// 收件人是否删除。 /// </summary> public bool IsDelete { get; set; }
LetterAppTypes (User 是用户间的站内信,System 是管理员发的站内性能(局部) Top 是管理员发给所有用户的站内信 (业务需要 全部置顶))
/// <summary> /// 站内信类型枚举 /// </summary> [Flags] public enum LetterAppTypes { /// <summary> /// 用户站内信 /// </summary> User = 1, /// <summary> /// 系统站内信 /// </summary> System = 2, /// <summary> /// 置顶站内信 /// </summary> Top = 4 }