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访问逻辑。

设计特点

  1. 仓储模式:提供了数据访问的抽象层
  2. 异步操作:所有数据库操作都是异步的
  3. 流式处理:搜索方法使用异步流,适合处理大量数据
  4. 类型安全:使用强类型的MongoDB驱动API
  5. 资源管理:正确处理游标等资源的释放

这个类为MongoDB数据访问提供了一个简洁而强大的基础实现,特别适合需要处理大量数据的场景。

评论加载中...