GwWuYou c3376bf4d5 feat(storage): 添加存储系统接口和文件存储实现
- 定义了IStorage接口提供同步和异步的数据存储操作功能
- 实现了基于文件系统的FileStorage类支持读写删除操作
- 添加了ScopedStorage包装器为存储键提供作用域前缀功能
- 创建了ISerializer接口并实现JsonSerializer使用Newtonsoft.Json
- 在项目中引入Newtonsoft.Json包依赖
2026-01-11 19:56:31 +08:00

98 lines
3.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using GFramework.Core.Abstractions.storage;
namespace GFramework.Game.storage;
/// <summary>
/// 提供带有作用域前缀的存储包装器,将所有键都加上指定的前缀
/// </summary>
/// <param name="inner">内部的实际存储实现</param>
/// <param name="prefix">用于所有键的前缀字符串</param>
public sealed class ScopedStorage(IStorage inner, string prefix) : IStorage
{
/// <summary>
/// 检查指定键是否存在
/// </summary>
/// <param name="key">要检查的键</param>
/// <returns>如果键存在则返回true否则返回false</returns>
public bool Exists(string key)
=> inner.Exists(Key(key));
/// <summary>
/// 异步检查指定键是否存在
/// </summary>
/// <param name="key">要检查的键</param>
/// <returns>如果键存在则返回true否则返回false</returns>
public Task<bool> ExistsAsync(string key)
=> inner.ExistsAsync(Key(key));
/// <summary>
/// 读取指定键的值
/// </summary>
/// <typeparam name="T">要读取的值的类型</typeparam>
/// <param name="key">要读取的键</param>
/// <returns>键对应的值</returns>
public T Read<T>(string key)
=> inner.Read<T>(Key(key));
/// <summary>
/// 读取指定键的值,如果键不存在则返回默认值
/// </summary>
/// <typeparam name="T">要读取的值的类型</typeparam>
/// <param name="key">要读取的键</param>
/// <param name="defaultValue">当键不存在时返回的默认值</param>
/// <returns>键对应的值或默认值</returns>
public T Read<T>(string key, T defaultValue)
=> inner.Read(Key(key), defaultValue);
/// <summary>
/// 异步读取指定键的值
/// </summary>
/// <typeparam name="T">要读取的值的类型</typeparam>
/// <param name="key">要读取的键</param>
/// <returns>键对应的值的任务</returns>
public Task<T> ReadAsync<T>(string key)
=> inner.ReadAsync<T>(Key(key));
/// <summary>
/// 写入指定键值对
/// </summary>
/// <typeparam name="T">要写入的值的类型</typeparam>
/// <param name="key">要写入的键</param>
/// <param name="value">要写入的值</param>
public void Write<T>(string key, T value)
=> inner.Write(Key(key), value);
/// <summary>
/// 异步写入指定键值对
/// </summary>
/// <typeparam name="T">要写入的值的类型</typeparam>
/// <param name="key">要写入的键</param>
/// <param name="value">要写入的值</param>
public Task WriteAsync<T>(string key, T value)
=> inner.WriteAsync(Key(key), value);
/// <summary>
/// 删除指定键
/// </summary>
/// <param name="key">要删除的键</param>
public void Delete(string key)
=> inner.Delete(Key(key));
/// <summary>
/// 为给定的键添加前缀
/// </summary>
/// <param name="key">原始键</param>
/// <returns>添加前缀后的键</returns>
private string Key(string key)
=> string.IsNullOrEmpty(prefix)
? key
: $"{prefix}/{key}";
/// <summary>
/// 创建一个新的作用域存储实例
/// </summary>
/// <param name="scope">新的作用域名称</param>
/// <returns>新的作用域存储实例</returns>
public IStorage Scope(string scope)
=> new ScopedStorage(inner, Key(scope));
}