From d93098638d743a6007fe02e756a48d73a9d07236 Mon Sep 17 00:00:00 2001
From: luoqian <2769838458@qq.com>
Date: Fri, 22 May 2026 14:45:07 +0800
Subject: [PATCH] =?UTF-8?q?docs:=20=E8=A1=A5=E5=85=A8=20C#=20XML=20?=
=?UTF-8?q?=E6=96=87=E6=A1=A3=E6=B3=A8=E9=87=8A=EF=BC=8C=E8=A6=86=E7=9B=96?=
=?UTF-8?q?=E6=89=80=E6=9C=89=E5=85=AC=E5=BC=80=E4=B8=8E=E5=86=85=E9=83=A8?=
=?UTF-8?q?=E6=88=90=E5=91=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
为 14 个项目中缺少 XML 注释的类、接口、方法、属性、字段、record、
枚举等成员补全中文文档注释。接口方法在接口层定义完整注释,实现类
使用 引用。私有辅助方法结合业务语义编写注释。
扫描结果:missing-csharp-docs.txt 缺失项归零。
构建结果:0 警告,0 错误。
Co-Authored-By: Claude Opus 4.7
---
.../Services/FileLibraryScanHostedService.cs | 14 ++++
.../Database/AppDataContextFactory.cs | 16 +++++
.../Database/DatabaseExtensions.cs | 6 ++
FileShare-PC/Views/MainWindow.axaml.cs | 18 +++++
.../Core/ServiceEndpointPatternMatcher.cs | 17 +++++
.../Core/ServiceRequestBinder.cs | 8 +++
FileShare-Services/Endpoints/AppEndpoints.cs | 6 ++
.../FileLibrary/FileLibraryContracts.cs | 53 +++++++++++++-
.../FileLibrary/FileLibraryEndpointService.cs | 19 +++++
.../FileLibrary/FileLibraryService.cs | 62 ++++++++++++++++
.../Services/FileLibrary/FileStreamService.cs | 13 ++++
.../IFileLibraryEndpointService.cs | 58 +++++++++++++++
.../FileLibrary/IFileLibraryService.cs | 70 +++++++++++++++++++
.../Services/FileLibrary/MediaFileTypes.cs | 16 +++++
.../Services/QrCode/IQrCodeService.cs | 8 +++
.../Services/QrCode/QrCodeContracts.cs | 3 +
.../Services/QrCode/QrCodeService.cs | 13 ++++
17 files changed, 397 insertions(+), 3 deletions(-)
diff --git a/FileShare-API/Services/FileLibraryScanHostedService.cs b/FileShare-API/Services/FileLibraryScanHostedService.cs
index 0431c33..2e5b9f0 100644
--- a/FileShare-API/Services/FileLibraryScanHostedService.cs
+++ b/FileShare-API/Services/FileLibraryScanHostedService.cs
@@ -2,11 +2,21 @@ using FileShare_Services.Services.FileLibrary;
namespace FileShare_API.Services
{
+ ///
+ /// 文件库定时扫描后台服务,每分钟执行一次扫描,检查是否有需要扫描的文件库目录。
+ ///
public sealed class FileLibraryScanHostedService(IServiceScopeFactory scopeFactory, ILogger logger)
: BackgroundService
{
+ ///
+ /// 扫描间隔,固定为 1 分钟。
+ ///
private static readonly TimeSpan Interval = TimeSpan.FromMinutes(1);
+ ///
+ /// 启动扫描循环,首次立即执行,之后按 周期重复执行。
+ ///
+ /// 应用关闭时触发的取消令牌。
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await ScanAsync(stoppingToken);
@@ -18,6 +28,10 @@ namespace FileShare_API.Services
}
}
+ ///
+ /// 创建临时作用域并调用 执行一次到期扫描。
+ ///
+ /// 取消令牌。
private async Task ScanAsync(CancellationToken cancellationToken)
{
try
diff --git a/FileShare-EFCore/Database/AppDataContextFactory.cs b/FileShare-EFCore/Database/AppDataContextFactory.cs
index 6b3da08..5172243 100644
--- a/FileShare-EFCore/Database/AppDataContextFactory.cs
+++ b/FileShare-EFCore/Database/AppDataContextFactory.cs
@@ -58,8 +58,18 @@ namespace FileShare_EFCore.Database
=> new(DesignTimeDatabaseConfiguration.Create(args, DatabaseProvider.MySQL));
}
+ ///
+ /// 为设计时工具(dotnet ef migrations)提供数据库连接配置。
+ ///
internal static class DesignTimeDatabaseConfiguration
{
+ ///
+ /// 解析命令行参数中的 --provider 选项,创建对应的 。
+ /// 未指定提供程序时默认使用 SQLite。
+ ///
+ /// 命令行参数。
+ /// 未指定时的默认数据库提供程序。
+ /// 对应数据库提供程序的配置。
public static DatabaseConfiguration Create(string[] args, DatabaseProvider defaultProvider = DatabaseProvider.SQLite)
{
DatabaseProviderRegistry.RegisterDefaults();
@@ -75,6 +85,12 @@ namespace FileShare_EFCore.Database
};
}
+ ///
+ /// 从命令行参数中解析 --provider 选项的值。
+ /// 支持 --provider sqlite 和 --provider=sqlite 两种格式。
+ ///
+ /// 命令行参数。
+ /// 解析到的数据库提供程序,未指定或无法识别时返回 null。
private static DatabaseProvider? GetProvider(string[] args)
{
for (var i = 0; i < args.Length; i++)
diff --git a/FileShare-EFCore/Database/DatabaseExtensions.cs b/FileShare-EFCore/Database/DatabaseExtensions.cs
index 0c7dce0..41aebac 100644
--- a/FileShare-EFCore/Database/DatabaseExtensions.cs
+++ b/FileShare-EFCore/Database/DatabaseExtensions.cs
@@ -40,6 +40,12 @@ namespace FileShare_EFCore.Database
return services;
}
+ ///
+ /// 根据 注册对应具体类型的 实现。
+ ///
+ /// 服务集合。
+ /// 数据库配置。
+ /// 数据库提供程序未注册时抛出。
private static void AddProviderAppDataContext(this IServiceCollection services, DatabaseConfiguration config)
{
switch (config.Provider)
diff --git a/FileShare-PC/Views/MainWindow.axaml.cs b/FileShare-PC/Views/MainWindow.axaml.cs
index 1a3ba3e..895d573 100644
--- a/FileShare-PC/Views/MainWindow.axaml.cs
+++ b/FileShare-PC/Views/MainWindow.axaml.cs
@@ -684,6 +684,10 @@ namespace FileShare_PC.Views
return true;
}
+ ///
+ /// 为媒体流响应添加 CORS 和 Range 请求头,允许浏览器跨域访问和分段请求。
+ ///
+ /// HTTP 响应对象。
private static void AddLocalMediaHeaders(HttpListenerResponse response)
{
response.Headers["Access-Control-Allow-Origin"] = "*";
@@ -692,6 +696,14 @@ namespace FileShare_PC.Views
response.Headers["Access-Control-Expose-Headers"] = "Accept-Ranges, Content-Length, Content-Range";
}
+ ///
+ /// 解析 HTTP Range 请求头中的 bytes=start-end 格式,支持两端省略和后缀长度(如 bytes=-500)。
+ ///
+ /// Range 请求头值。
+ /// 资源总字节数。
+ /// 解析出的起始字节偏移。
+ /// 解析出的结束字节偏移。
+ /// 解析成功返回 true,否则 false。
private static bool TryParseByteRange(string? value, long length, out long start, out long end)
{
start = 0;
@@ -737,6 +749,12 @@ namespace FileShare_PC.Views
return true;
}
+ ///
+ /// 从输入流读取指定字节数并写入输出流,用于实现 HTTP Range 分段响应。
+ ///
+ /// 源文件流。
+ /// HTTP 响应输出流。
+ /// 需要传输的剩余字节数。
private static async Task CopyRangeAsync(Stream input, Stream output, long bytesRemaining)
{
var buffer = new byte[64 * 1024];
diff --git a/FileShare-Services/Core/ServiceEndpointPatternMatcher.cs b/FileShare-Services/Core/ServiceEndpointPatternMatcher.cs
index d6cbca2..064a0a5 100644
--- a/FileShare-Services/Core/ServiceEndpointPatternMatcher.cs
+++ b/FileShare-Services/Core/ServiceEndpointPatternMatcher.cs
@@ -47,11 +47,22 @@ namespace FileShare_Services.Core
return true;
}
+ ///
+ /// 将路径按 / 拆分为非空片段数组。
+ ///
+ /// 路径字符串。
+ /// 过滤空条目后的片段数组。
private static string[] SplitSegments(string value)
{
return value.Split('/', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
}
+ ///
+ /// 尝试从 {name} 或 {name:constraint} 格式的片段中提取参数名称。
+ ///
+ /// 模式片段。
+ /// 提取出的参数名称。
+ /// 该片段是路由参数时返回 true,否则 false。
private static bool TryGetParameterName(string segment, out string parameterName)
{
parameterName = string.Empty;
@@ -66,6 +77,12 @@ namespace FileShare_Services.Core
return !string.IsNullOrWhiteSpace(parameterName);
}
+ ///
+ /// 检查路由值是否满足片段中的类型约束(目前仅支持 :int)。
+ ///
+ /// 包含约束的模式片段。
+ /// 实际路径值。
+ /// 满足约束时返回 true。
private static bool MatchesConstraint(string segment, string value)
{
return !segment.EndsWith(":int}", StringComparison.OrdinalIgnoreCase)
diff --git a/FileShare-Services/Core/ServiceRequestBinder.cs b/FileShare-Services/Core/ServiceRequestBinder.cs
index 6e1dab3..7ff9f71 100644
--- a/FileShare-Services/Core/ServiceRequestBinder.cs
+++ b/FileShare-Services/Core/ServiceRequestBinder.cs
@@ -37,6 +37,14 @@ namespace FileShare_Services.Core
return Deserialize(json, "query");
}
+ ///
+ /// 将 JSON 反序列化为目标类型,反序列化失败或结果为 null 时抛出 。
+ ///
+ /// 目标类型。
+ /// JSON 字符串。
+ /// 来源标识(body 或 query),用于异常消息。
+ /// 反序列化后的实例。
+ /// JSON 无法绑定到目标类型时抛出。
private static T Deserialize(string json, string source)
{
try
diff --git a/FileShare-Services/Endpoints/AppEndpoints.cs b/FileShare-Services/Endpoints/AppEndpoints.cs
index 8a3b717..4080f4b 100644
--- a/FileShare-Services/Endpoints/AppEndpoints.cs
+++ b/FileShare-Services/Endpoints/AppEndpoints.cs
@@ -98,6 +98,12 @@ namespace FileShare_Services.Endpoints
#region 业务处理方法
+ ///
+ /// 从 中解析 ,
+ /// 读取查询参数中的文件 ID,返回文件流响应。
+ ///
+ /// 端点上下文。
+ /// 文件流响应对象,服务不可用或 ID 无效时返回 null。
private static async Task