LiteDb
本文记录LiteDb的使用,建议初学者使用时先根据官方的文档进行学习。
封装的代码
LiteDbWrapper.cs
/// <summary> /// 官网:http://www.litedb.org/ /// GitHub:https://github.com/mbdavid?tab=repositories /// GitHub:https://github.com/mbdavid/LiteDB /// LiteDB连接字符串:http://www.litedb.org/docs/connection-string/ /// http://www.litedb.org/docs/getting-started/ /// </summary> public partial class LiteDbWrapper : IDisposable { /// <summary> /// 数据库文件名称 /// </summary> public string FilePath { get; private set; } private LiteDatabase _liteDb; /// <summary> /// LiteDb数据库 /// </summary> public LiteDatabase LiteDb { get { return this._liteDb; } private set { this._liteDb = value; } } /// <summary> /// 构造函数 /// </summary> /// <param name="dbFilePath">数据库文件路径或连接字符串</param> /// <param name="autoInit">是否自动初始化,默认false</param> public LiteDbWrapper(string dbFilePath, bool autoInit = false) { this.FilePath = dbFilePath; if (autoInit) { this.InitialDb(); } } /// <summary> /// 初始化LiteDB /// </summary> public virtual void InitialDb() { if (string.IsNullOrEmpty(this.FilePath)) { throw new ArgumentNullException(nameof(this.FilePath)); } if (null == this.LiteDb) { this.LiteDb = new LiteDatabase(this.FilePath); } } /// <summary> /// 执行数据库操作 /// </summary> /// <param name="action"></param> public virtual void Do(Action<LiteDatabase> action) { if (null != this.LiteDb) { // 长连接 action?.Invoke(this.LiteDb); } else { // 短连接 using (var db = new LiteDatabase(this.FilePath)) { action?.Invoke(db); } } } /// <summary> /// 执行数组对象的操作 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="action"></param> /// <param name="name">Collection name (case insensitive)</param> public virtual void Do<T>(Action<ILiteCollection<T>> action, string name = null) { if (null != this.LiteDb) { // 长连接 var col = this.LiteDb.GetCollection<T>(name); action?.Invoke(col); } else { // 短连接 using (var db = new LiteDatabase(this.FilePath)) { var col = db.GetCollection<T>(name); action?.Invoke(col); } } } /// <summary> /// 释放资源 /// </summary> public virtual void Dispose() { if ((null != this.LiteDb)) { this.LiteDb.Dispose(); } } } public static class LiteDbExtensions { /// <summary> /// 根据Id存储文件,如果文件存在则更新 /// </summary> /// <typeparam name="TFileId"></typeparam> /// <param name="db"></param> /// <param name="id"></param> /// <param name="filePath"></param> /// <param name="metaData"></param> /// <returns></returns> public static LiteFileInfo<TFileId> UploadFile<TFileId>(this LiteDatabase db, TFileId id, string filePath, BsonDocument metaData = null) { // Get file storage with Int Id var storage = db.GetStorage<TFileId>(); // Upload a file from file system to database var liteFileInfo = storage.Upload(id, filePath); if ((null != liteFileInfo) && (null != metaData)) { if (storage.Exists(liteFileInfo.Id)) { storage.SetMetadata(liteFileInfo.Id, metaData); } } return storage.FindById(liteFileInfo.Id); } /// <summary> /// 根据Id存储文件,如果文件存在则更新 /// </summary> /// <typeparam name="TFileId"></typeparam> /// <param name="db"></param> /// <param name="id"></param> /// <param name="fileName"></param> /// <param name="stream"></param> /// <param name="metaData"></param> /// <returns></returns> public static LiteFileInfo<TFileId> UploadFile<TFileId>(this LiteDatabase db, TFileId id, string fileName, Stream stream, BsonDocument metaData = null) { // Get file storage with Int Id var storage = db.GetStorage<TFileId>(); // Upload a file from Stream var liteFileInfo = storage.Upload(id, fileName, stream, metaData); return liteFileInfo; } /// <summary> /// 下载文件 /// </summary> /// <param name="db"></param> /// <param name="id"></param> /// <param name="filePath"></param> /// <returns></returns> public static LiteFileInfo<TFileId> DownloadFile<TFileId>(this LiteDatabase db, TFileId id, string filePath) { // Get file storage with Int Id var storage = db.GetStorage<TFileId>(); // And download later var liteFileInfo = storage.Download(id, filePath, true); return liteFileInfo; } /// <summary> /// 下载文件 /// </summary> /// <typeparam name="TFileId"></typeparam> /// <param name="db"></param> /// <param name="id"></param> /// <param name="stream"></param> /// <returns></returns> public static LiteFileInfo<TFileId> DownloadFile<TFileId>(this LiteDatabase db, TFileId id, Stream stream) { // Get file storage with Int Id var storage = db.GetStorage<TFileId>(); // And download later var liteFileInfo = storage.Download(id, stream); return liteFileInfo; } /// <summary> /// 删除文件 /// </summary> /// <typeparam name="TFileId"></typeparam> /// <param name="db"></param> /// <param name="id"></param> /// <returns></returns> public static bool DeleteFile<TFileId>(this LiteDatabase db, TFileId id) { // Get file storage with Id var storage = db.GetStorage<TFileId>(); // And delete file, return true if success, false if not found return storage.Delete(id); } }
RegisterTypeManager.cs
/// <summary> /// 自定义注册类型接口 /// </summary> /// <typeparam name="T"></typeparam> public interface IRegisterType<T> { /// <summary> /// 注册 /// </summary> void RegisterType(); /// <summary> /// 序列化 /// </summary> /// <param name="entity"></param> /// <returns></returns> BsonValue Serialize(T entity); /// <summary> /// 反序列化 /// </summary> /// <param name="bsonValue"></param> /// <returns></returns> T Deserialize(BsonValue bsonValue); } public abstract class RegisterTypeBase<T> : IRegisterType<T> { /// <summary> /// 注册 /// </summary> public void RegisterType() => BsonMapper.Global.RegisterType<T>(Serialize, Deserialize); /// <summary> /// 序列化 /// </summary> /// <param name="entity"></param> /// <returns></returns> public abstract BsonValue Serialize(T entity); /// <summary> /// 反序列化 /// </summary> /// <param name="bsonValue"></param> /// <returns></returns> public abstract T Deserialize(BsonValue bsonValue); } public static class RegisterTypeManager { public static void RegisterType<T>(RegisterTypeBase<T> registerType) { registerType.RegisterType(); } } public class PointMapper : RegisterTypeBase<Point> { public override Point Deserialize(BsonValue bsonValue) { var x = bsonValue["X"].AsInt32; var y = bsonValue["Y"].AsInt32; return new Point(x, y); } public override BsonValue Serialize(Point entity) { return new BsonDocument(new Dictionary<string, BsonValue> { {"X", entity.X}, {"Y", entity.Y}, }); } } .... .... .... .... // 注册自定义序列化/反序列化器 RegisterTypeManager.RegisterType(new PointMapper());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-06-11 SonarQube扫描C#代码