// ============================================================================ // 【文件说明】IHwSearchSchemaService.cs - 搜索表结构服务接口 // ============================================================================ // 这个接口定义了搜索表结构初始化的契约。 // // 【为什么需要接口?】 // 1. 依赖倒置原则(DIP):高层模块依赖抽象,不依赖具体实现 // 2. 便于测试:可以 Mock 这个接口进行单元测试 // 3. 便于扩展:未来可以有不同的实现(如支持 PostgreSQL) // // 【与 Java Spring Boot 的对比】 // Java Spring Boot: // public interface IHwSearchSchemaService { // CompletableFuture ensureCreatedAsync(); // } // // C# ASP.NET Core: // public interface IHwSearchSchemaService { // Task EnsureCreatedAsync(CancellationToken cancellationToken = default); // } // // 两者概念完全一样,只是异步返回类型不同: // - Java 用 CompletableFuture // - C# 用 Task // ============================================================================ namespace Admin.NET.Plugin.HwPortal; /// /// 搜索表结构服务接口。 /// /// 【C# 语法知识点 - 接口定义】 /// public interface IHwSearchSchemaService /// /// 接口定义了一组方法签名,不包含实现: /// - 只声明方法,不实现方法 /// - 实现类必须提供所有方法的具体实现 /// /// 对比 Java: /// Java 的接口语法完全一样: /// public interface IHwSearchSchemaService { /// void ensureCreatedAsync(); /// } /// /// 【命名约定】 /// C# 接口命名约定:I + PascalCase /// - IHwSearchSchemaService:I 前缀表示 Interface /// - HwSearchSchemaService:实现类不加 I 前缀 /// /// Java 接口命名约定:不加 I 前缀 /// - HwSearchSchemaService:接口 /// - HwSearchSchemaServiceImpl:实现类 /// /// public interface IHwSearchSchemaService { /// /// 确保搜索表已创建。 /// /// 【方法语义】 /// "Ensure" 表示"确保",是一种幂等操作: /// - 如果表已存在,不做任何操作 /// - 如果表不存在,创建表 /// /// 对比 "Create": /// - Create:每次都创建,重复调用会报错 /// - EnsureCreated:幂等,可以安全地多次调用 /// /// /// 【C# 语法知识点 - CancellationToken 参数】 /// CancellationToken cancellationToken = default /// /// 这是 C# 异步编程的标准模式: /// - CancellationToken:取消令牌,用于取消长时间运行的操作 /// - = default:默认值,调用时可以不传 /// /// 使用场景: /// 1. 用户取消请求:浏览器关闭或刷新 /// 2. 超时取消:操作超过指定时间 /// 3. 应用关闭:服务器需要优雅关闭 /// /// 对比 Java: /// Java 没有内置的取消机制,通常用自定义标志位: /// private volatile boolean cancelled = false; /// public void cancel() { cancelled = true; } /// /// C# 的 CancellationToken 是框架级支持,更优雅。 /// /// /// 取消令牌 /// 异步任务 Task EnsureCreatedAsync(CancellationToken cancellationToken = default); }