using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Dpz.Core.Entity.Base;
using MongoDB.Driver;

namespace Dpz.Core.MongodbAccess;

public interface IRepository
{
    IMongoDatabase Database { get; }
}

public interface IRepository<T> : IRepository
    where T : IBaseEntity
{
    /// <summary>
    /// 获取 该实体Mongodb的集合
    /// </summary>
    IMongoCollection<T> Collection { get; }

    /// <summary>
    /// Queryable
    /// </summary>
    IQueryable<T> MongodbQueryable { get; }

    /// <summary>
    /// 查询数据
    /// </summary>
    /// <param name="predicate"></param>
    /// <returns></returns>
    IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);

    /// <summary>
    /// 数据查询
    /// </summary>
    /// <param name="filter"></param>
    /// <returns></returns>
    IFindFluent<T, T> SearchFor(FilterDefinition<T> filter);

    /// <summary>
    ///
    /// </summary>
    /// <param name="filter"></param>
    /// <param name="options"></param>
    /// <returns></returns>
    IFindFluent<T, T> SearchFor(FilterDefinition<T> filter, FindOptions options);

    /// <summary>
    /// 异步 数据查询
    /// </summary>
    /// <param name="filter"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    IAsyncEnumerable<T> SearchForAsync(
        FilterDefinition<T> filter,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 异步 数据查询
    /// </summary>
    /// <param name="filter"></param>
    /// <param name="options"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    IAsyncEnumerable<T> SearchForAsync(
        FilterDefinition<T> filter,
        FindOptions<T> options,
        CancellationToken cancellationToken = default
    );

    #region 异步方法

    /// <summary>
    /// (异步)根据 Id 获取单条记录,不存在将会返回null
    /// </summary>
    /// <param name="id"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<T?> FindAsync(object id, CancellationToken cancellationToken = default);

    /// <summary>
    /// 插入数据
    /// </summary>
    /// <param name="entity"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task InsertAsync(T entity, CancellationToken cancellationToken = default);

    /// <summary>
    /// 插入数据
    /// </summary>
    /// <param name="source"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task InsertAsync(IReadOnlyCollection<T> source, CancellationToken cancellationToken = default);

    /// <summary>
    /// 删除数据
    /// </summary>
    /// <param name="filter"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<DeleteResult> DeleteAsync(
        Expression<Func<T, bool>> filter,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 删除数据
    /// </summary>
    /// <param name="filter"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<DeleteResult> DeleteAsync(
        FilterDefinition<T> filter,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 根据ID删除
    /// </summary>
    /// <param name="id"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<DeleteResult> DeleteAsync(object id, CancellationToken cancellationToken = default);

    /// <summary>
    /// 根据查询条件更新数据
    /// </summary>
    /// <param name="predicate"></param>
    /// <param name="update"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<UpdateResult> UpdateAsync(
        Expression<Func<T, bool>> predicate,
        UpdateDefinition<T> update,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 根据实体修改数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="entity"></param>
    /// <param name="cancellationToken"></param>
    /// <exception cref="ArgumentException">If the entity no exists property 'id',then will throw exception.</exception>
    Task<ReplaceOneResult> UpdateAsync(T entity, CancellationToken cancellationToken = default);

    /// <summary>
    /// 批量修改实体
    /// </summary>
    /// <param name="entities"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<BulkWriteResult<T>> UpdateAsync(
        IEnumerable<T> entities,
        CancellationToken cancellationToken = default
    );

    #endregion
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个基于MongoDB的仓储模式(Repository Pattern)接口定义代码,用于封装MongoDB数据访问操作。让我详细解释一下:

接口结构

1. IRepository 基础接口

public interface IRepository
{
    IMongoDatabase Database { get; }
}
  • 这是一个基础接口,提供对MongoDB数据库实例的访问
  • 所有仓储都需要实现这个接口

2. IRepository<T> 泛型接口

这是主要的仓储接口,继承自基础接口,其中 T 必须实现 IBaseEntity 接口。

主要功能分类

数据访问属性

  • Collection:获取MongoDB中对应实体的集合
  • MongodbQueryable:提供LINQ查询能力

查询方法

提供了多种查询方式:

  1. 基于表达式的查询SearchFor(Expression<Func<T, bool>> predicate)
  2. 基于过滤器的查询SearchFor(FilterDefinition<T> filter)
  3. 异步查询SearchForAsync 方法,返回 IAsyncEnumerable<T>

异步CRUD操作

查询(Read)

  • FindAsync(object id):根据ID查找单条记录

创建(Create)

  • InsertAsync(T entity):插入单条记录
  • InsertAsync(IReadOnlyCollection<T> source):批量插入

删除(Delete)

  • DeleteAsync(Expression<Func<T, bool>> filter):基于表达式删除
  • DeleteAsync(FilterDefinition<T> filter):基于过滤器删除
  • DeleteAsync(object id):根据ID删除

更新(Update)

  • UpdateAsync(Expression<Func<T, bool>> predicate, UpdateDefinition<T> update):条件更新
  • UpdateAsync(T entity):实体更新
  • UpdateAsync(IEnumerable<T> entities):批量更新

设计特点

  1. 异步优先:所有数据操作都是异步的,支持 CancellationToken
  2. 类型安全:使用泛型约束确保实体类型正确
  3. 灵活查询:支持LINQ表达式和MongoDB原生过滤器
  4. 批量操作:支持批量插入和更新
  5. 返回类型丰富:不同操作返回相应的MongoDB结果类型(如 DeleteResultUpdateResult 等)

这个接口设计遵循了仓储模式的最佳实践,为MongoDB数据访问提供了统一、类型安全且功能完整的抽象层。

评论加载中...