using Microsoft.AspNetCore.Http;

namespace Dpz.Core.Service.Mediator.Features.Media.Commands;

/// <summary>
/// 发布或更新照片信息的请求。
/// </summary>
public class PublishPhotoRequest : IRequest<ResponseResult>
{
    /// <summary>
    /// 照片
    /// </summary>
    public IFormFile? Photo { get; set; }

    /// <summary>
    /// 描述
    /// </summary>
    public string? Description { get; set; }

    /// <summary>
    /// 标签
    /// </summary>
    public List<string> Tags
    {
        get => (field ?? []).Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).ToList();
        set;
    } = [];

    /// <summary>
    /// 记录ID
    /// </summary>
    public string? Id { get; set; }

    /// <summary>
    /// 创建者
    /// </summary>
    public required VmUserInfo Creator { get; set; }

    /// <summary>
    /// 清理相册缓存。
    /// </summary>
    public Func<IReadOnlyCollection<string>, CancellationToken, Task>? ClearCacheAsync { get; set; }

    /// <summary>
    /// 上传
    /// </summary>
    public required Func<
        byte[],
        List<string>,
        string,
        CancellationToken,
        Task<UploadResult>
    > UploadAsync { get; set; }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个基于 MediatR 模式的命令请求类,用于处理照片的发布或更新操作。让我详细解释一下这个类的各个组成部分:

类的基本信息

public class PublishPhotoRequest : IRequest<ResponseResult>
  • 继承自 IRequest<ResponseResult>,这是 MediatR 的接口
  • 表示这是一个会返回 ResponseResult 类型结果的请求命令

属性详解

1. 照片文件

public IFormFile? Photo { get; set; }
  • 用于接收上传的照片文件
  • IFormFile 是 ASP.NET Core 中处理文件上传的接口
  • 可为空,支持更新操作时不重新上传照片

2. 描述信息

public string? Description { get; set; }
  • 照片的描述文字,可选

3. 标签处理

public List<string> Tags
{
    get => (field ?? []).Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).ToList();
    set;
} = [];
  • 使用了 C# 12 的新特性 field 关键字
  • Get 访问器会自动:
    • 去除每个标签的前后空格 (Trim())
    • 过滤掉空字符串
    • 返回清理后的标签列表
  • 默认值为空列表

4. 记录ID

public string? Id { get; set; }
  • 用于区分新增还是更新操作
  • 为空时表示新增,有值时表示更新

5. 创建者信息

public required VmUserInfo Creator { get; set; }
  • 使用 required 关键字,表示必须提供
  • 记录照片的创建者信息

6. 缓存清理委托

public Func<IReadOnlyCollection<string>, CancellationToken, Task>? ClearCacheAsync { get; set; }
  • 可选的异步委托函数
  • 用于在操作完成后清理相关的相册缓存
  • 接受字符串集合和取消令牌作为参数

7. 上传处理委托

public required Func<byte[], List<string>, string, CancellationToken, Task<UploadResult>> UploadAsync { get; set; }
  • 必需的异步委托函数
  • 处理照片的实际上传逻辑
  • 参数包括:字节数组(照片数据)、标签列表、字符串参数、取消令牌
  • 返回上传结果

设计特点

  1. 依赖注入友好:通过委托的方式注入具体的业务逻辑
  2. 支持异步操作:所有耗时操作都支持 CancellationToken
  3. 数据验证:标签属性有自动清理逻辑
  4. 灵活性:通过可选的 ID 支持新增和更新两种场景
  5. 关注点分离:请求类只负责数据传输,具体业务逻辑通过委托注入

这种设计模式常用于 CQRS(命令查询责任分离)架构中,有助于保持代码的清晰和可测试性。

评论加载中...