using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
namespace Dpz.Core.MongodbAccess;
public class RepositoryBase(string? connectionString) : IRepositoryBase
{
private readonly AnyAccess _access = string.IsNullOrWhiteSpace(connectionString)
? throw new ArgumentNullException(nameof(connectionString))
: new AnyAccess(connectionString);
public IMongoDatabase Database => _access.Database;
public async Task<List<string>> GetAllCollectionAsync()
{
using var cursor = await Database.ListCollectionNamesAsync();
var list = await cursor.ToListAsync();
return list;
}
public async IAsyncEnumerable<BsonDocument> SearchForAsync(
string collectionName,
FilterDefinition<BsonDocument>? filter = null,
FindOptions<BsonDocument>? options = null,
[EnumeratorCancellation] CancellationToken cancellationToken = default
)
{
filter ??= Builders<BsonDocument>.Filter.Empty;
var result = await Database
.GetCollection<BsonDocument>(collectionName)
.FindAsync(filter, options, cancellationToken);
while (await result.MoveNextAsync(cancellationToken))
{
foreach (var item in result.Current)
{
yield return item;
}
}
}
public async Task InsertAsync(string collectionName, ICollection<BsonDocument> source)
{
await Database.GetCollection<BsonDocument>(collectionName).InsertManyAsync(source);
}
public async Task DeleteAllAsync(string collectionName)
{
await Database
.GetCollection<BsonDocument>(collectionName)
.DeleteManyAsync(Builders<BsonDocument>.Filter.Empty);
}
private class AnyAccess(string? connectionString) : MongodbAccess(connectionString);
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
这是一个基于MongoDB的仓储模式基础类的实现。让我详细解释一下这个代码的结构和功能:
类的基本结构
public class RepositoryBase(string? connectionString) : IRepositoryBase
这个类使用了C# 12的主构造函数语法,接收一个连接字符串参数,并实现了IRepositoryBase接口。
核心组件
1. 数据库访问对象
private readonly AnyAccess _access = string.IsNullOrWhiteSpace(connectionString)
? throw new ArgumentNullException(nameof(connectionString))
: new AnyAccess(connectionString);
- 在构造时验证连接字符串不能为空
- 创建一个
AnyAccess实例来管理MongoDB连接
2. 数据库属性
public IMongoDatabase Database => _access.Database;
提供对MongoDB数据库实例的访问。
主要功能方法
1. 获取所有集合名称
public async Task<List<string>> GetAllCollectionAsync()
- 异步获取数据库中所有集合的名称
- 使用游标模式遍历集合列表
2. 搜索文档(异步枚举)
public async IAsyncEnumerable<BsonDocument> SearchForAsync(...)
这是一个异步流方法,特点包括:
- 使用
IAsyncEnumerable<T>返回类型,支持await foreach - 支持取消令牌(
CancellationToken) - 使用
[EnumeratorCancellation]特性自动传播取消令牌 - 采用
yield return模式,实现延迟执行和内存友好的数据流
3. 批量插入文档
public async Task InsertAsync(string collectionName, ICollection<BsonDocument> source)
- 将多个BSON文档批量插入到指定集合
4. 删除所有文档
public async Task DeleteAllAsync(string collectionName)
- 删除指定集合中的所有文档(使用空过滤器)
内部辅助类
private class AnyAccess(string? connectionString) : MongodbAccess(connectionString);
这是一个私有的内部类,继承自MongodbAccess,用于封装具体的MongoDB访问逻辑。
设计特点
- 仓储模式:提供了数据访问的抽象层
- 异步操作:所有数据库操作都是异步的
- 流式处理:搜索方法使用异步流,适合处理大量数据
- 类型安全:使用强类型的MongoDB驱动API
- 资源管理:正确处理游标等资源的释放
这个类为MongoDB数据访问提供了一个简洁而强大的基础实现,特别适合需要处理大量数据的场景。
AI 正在分析代码…
评论加载中...