using System.ComponentModel.DataAnnotations;
using Dpz.Core.Entity.Base.MapperConfig;
using Dpz.Core.EnumLibrary;
using Dpz.Core.Public.Entity;
using Mapster;
namespace Dpz.Core.Public.ViewModel;
public class MembleComment : IHaveCustomMapping
{
/// <summary>
/// 评论类型
/// </summary>
[Required(ErrorMessage = "comment node is empty.")]
public required CommentNode Node { get; set; }
/// <summary>
/// 关联
/// </summary>
[
Required(ErrorMessage = "relation is empty."),
MaxLength(500, ErrorMessage = "relation max length 20.")
]
public required string Relation { get; set; }
/// <summary>
/// 回复内容
/// </summary>
[
Required(ErrorMessage = "请输入回复内容"),
MaxLength(2000, ErrorMessage = "回复内容最大长度为2000")
]
public required string CommentText { get; set; }
/// <summary>
/// 回复ID
/// </summary>
[MaxLength(50, ErrorMessage = "reply id max length 15")]
public string? ReplyId { get; set; }
public VmUserInfo? User { get; set; }
public static void CreateMappings(TypeAdapterConfig cfg)
{
cfg.NewConfig<MembleComment, Comment>().MapWith(x => CreateCommentEntity(x));
}
private static Comment CreateCommentEntity(MembleComment viewModel)
{
var entity = new Comment
{
Node = viewModel.Node,
Relation = viewModel.Relation,
CommentText = viewModel.CommentText,
Commenter = new MembleCommenter()
{
Avatar =
viewModel.User?.Avatar
?? throw new ArgumentNullException(nameof(viewModel.User)),
Identity =
viewModel.User?.Permissions?.HasFlag(Permissions.System) == true
? "管理员"
: "成员",
NickName =
viewModel.User?.Name ?? throw new ArgumentNullException(nameof(viewModel.User)),
},
};
return entity;
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
这是一个C#代码文件,定义了一个名为MembleComment的视图模型类,主要用于处理评论相关的数据传输和映射。让我详细解释一下:
类的基本结构
public class MembleComment : IHaveCustomMapping
- 继承了
IHaveCustomMapping接口,表示这个类有自定义的映射配置 - 这是一个视图模型(ViewModel)类,通常用于在前端和后端之间传输数据
属性定义
1. Node (评论类型)
[Required(ErrorMessage = "comment node is empty.")]
public required CommentNode Node { get; set; }
- 必填字段,使用了
CommentNode枚举类型 - 用于标识评论的节点类型
2. Relation (关联)
[Required(ErrorMessage = "relation is empty."),
MaxLength(500, ErrorMessage = "relation max length 20.")]
public required string Relation { get; set; }
- 必填字符串字段,最大长度500字符(注意:错误消息写的是20,但实际验证是500)
- 用于存储评论的关联信息
3. CommentText (回复内容)
[Required(ErrorMessage = "请输入回复内容"),
MaxLength(2000, ErrorMessage = "回复内容最大长度为2000")]
public required string CommentText { get; set; }
- 必填字段,评论的具体内容
- 最大长度2000字符
4. ReplyId (回复ID)
[MaxLength(50, ErrorMessage = "reply id max length 15")]
public string? ReplyId { get; set; }
- 可选字段,用于标识这是对某个评论的回复
- 最大长度50字符(错误消息显示15,但验证是50)
5. User (用户信息)
public VmUserInfo? User { get; set; }
- 可选的用户信息对象
映射配置
CreateMappings方法
public static void CreateMappings(TypeAdapterConfig cfg)
{
cfg.NewConfig<MembleComment, Comment>().MapWith(x => CreateCommentEntity(x));
}
- 使用Mapster库配置从
MembleComment到Comment实体的映射 - 指定使用自定义的
CreateCommentEntity方法进行映射
CreateCommentEntity方法
private static Comment CreateCommentEntity(MembleComment viewModel)
{
var entity = new Comment
{
Node = viewModel.Node,
Relation = viewModel.Relation,
CommentText = viewModel.CommentText,
Commenter = new MembleCommenter()
{
Avatar = viewModel.User?.Avatar ?? throw new ArgumentNullException(nameof(viewModel.User)),
Identity = viewModel.User?.Permissions?.HasFlag(Permissions.System) == true ? "管理员" : "成员",
NickName = viewModel.User?.Name ?? throw new ArgumentNullException(nameof(viewModel.User)),
},
};
return entity;
}
这个方法的主要功能:
- 创建新的
Comment实体对象 - 直接映射基本属性(Node、Relation、CommentText)
- 创建
MembleCommenter对象,包含:- Avatar: 用户头像,如果为空则抛出异常
- Identity: 根据用户权限判断身份(系统权限=管理员,否则=成员)
- NickName: 用户昵称,如果为空则抛出异常
总结
这个类的主要作用是:
- 作为评论数据的传输对象,包含数据验证规则
- 提供从视图模型到实体模型的自定义映射逻辑
- 处理用户身份识别和评论者信息的构建
- 确保关键用户信息不为空,否则抛出异常
这是一个典型的DDD(领域驱动设计)模式中的应用服务层对象,用于处理业务逻辑和数据转换。
评论加载中...