百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

ASP.NET Core 中的通用 MongoDB 存储库模式

bigegpt 2024-08-15 20:00 2 浏览


概述:在现代软件开发中,与各种数据存储解决方案进行交互是很常见的,而 MongoDB 是流行的选择之一,尤其是在灵活性和可扩展性至关重要的场景中。使用 ASP.NET Core 开发应用程序时,拥有结构良好的数据访问层对于可维护性和可扩展性至关重要。在本文中,我们将探讨如何在 ASP.NET Core 中利用 MongoDB .NET 驱动程序实现通用 MongoDB 存储库模式。了解存储库模式存储库模式是一种设计模式,它将从基础数据存储中检索数据的逻辑与应用程序的其余部分分开。它提供了比数据访问操作更高级别的抽象,使应用程序代码更加模块化和可测试。存储库模式的关键组件包括:存储库接口:定义与数据存

在现代软件开发中,与各种数据存储解决方案进行交互是很常见的,而 MongoDB 是流行的选择之一,尤其是在灵活性和可扩展性至关重要的场景中。使用 ASP.NET Core 开发应用程序时,拥有结构良好的数据访问层对于可维护性和可扩展性至关重要。在本文中,我们将探讨如何在 ASP.NET Core 中利用 MongoDB .NET 驱动程序实现通用 MongoDB 存储库模式。

了解存储库模式

存储库模式是一种设计模式,它将从基础数据存储中检索数据的逻辑与应用程序的其余部分分开。它提供了比数据访问操作更高级别的抽象,使应用程序代码更加模块化和可测试。存储库模式的关键组件包括:

  • 存储库接口:定义与数据存储交互的协定。
  • 具体存储库实现:实现存储库接口,并包含 CRUD(创建、读取、更新、删除)操作的逻辑。

构建通用 MongoDB 存储库

为了在 ASP.NET Core 中实现 MongoDB 的存储库模式,我们将创建一个可用于任何类型的实体的通用存储库类。让我们分解一下实现的组件:

1. 存储库接口

我们定义存储库接口如下:IRepository<T>

public interface IRepository<T>  
{  
    Task<IEnumerable<T>> GetAllAsync(ProjectionDefinition<T> project, int limit);  
    Task<T> GetByIdAsync(string id);  
    Task<IEnumerable<T>> GetAllAsync(FilterDefinition<T> filter, ProjectionDefinition<T> projection, int limit);  
    Task<T> CreateAsync(T entity);  
    Task UpdateAsync(string id, T entity);  
    Task DeleteAsync(string id);  
}

此接口指定可对任何实体类型执行的常见 CRUD 操作。T

2. 具体存储库实现

我们的具体存储库实现 利用 MongoDB .NET 驱动程序与 MongoDB 数据库进行交互。这是它的样子:MongoRepository<T>

using MongoDB.Driver;

    public class MongoRepository<T> : IRepository<T>
    {
        FilterDefinitionBuilder<T> _filterBuilder;
        private readonly IMongoCollection<T> _collection;

        /// <summary>
        /// Initializes a new instance of the MongoRepository class.
        /// </summary>
        /// <param name="database">MongoDB database instance.</param>
        /// <param name="collectionName">Name of the collection.</param>
        public MongoRepository(IMongoDatabase database, string collectionName)
        {
            _collection = database.GetCollection<T>(collectionName);
            _filterBuilder = new FilterDefinitionBuilder<T>();
        }

        /// <summary>
        /// Retrieves all documents from the collection.
        /// </summary>
        /// <returns>A list of entities.</returns>
        public async Task<IEnumerable<T>> GetAllAsync(ProjectionDefinition<T> project, int limit)
        {
            return await _collection.Find(_ => true).Project<T>(project).Limit(limit).ToListAsync();
        }

        /// <summary>
        /// Retrieves a document by its unique identifier.
        /// </summary>
        /// <param name="id">Unique identifier of the document.</param>
        /// <returns>The entity corresponding to the provided identifier, or null if not found.</returns>
        public async Task<T> GetByIdAsync(string id)
        {
            var filter = Builders<T>.Filter.Eq("_id", id);
            return await _collection.Find(filter).FirstOrDefaultAsync();
        }

        /// <summary>
        /// Retrieves documents from the collection based on a filter.
        /// </summary>
        /// <param name="filter">Filter definition to apply.</param>
        /// <returns>A list of entities matching the filter.</returns>
        public async Task<IEnumerable<T>> GetAllAsync(FilterDefinition<T> filter, ProjectionDefinition<T> projection, int limit)
        {
            var query = _collection.Find(filter).Limit(limit);

            if (projection != null)
                query = query.Project<T>(projection);

            return await query.ToListAsync();
        }

        /// <summary>
        /// Creates a new document in the collection.
        /// </summary>
        /// <param name="entity">Entity to be created.</param>
        /// <returns>The created entity.</returns>
        public async Task<T> CreateAsync(T entity)
        {
            await _collection.InsertOneAsync(entity);
            return entity;
        }

        /// <summary>
        /// Updates an existing document in the collection.
        /// </summary>
        /// <param name="id">Unique identifier of the document to update.</param>
        /// <param name="entity">Updated entity.</param>
        public async Task UpdateAsync(string id, T entity)
        {
            var filter = Builders<T>.Filter.Eq("_id", id);
            await _collection.ReplaceOneAsync(filter, entity);
        }

        /// <summary>
        /// Deletes a document from the collection.
        /// </summary>
        /// <param name="id">Unique identifier of the document to delete.</param>
        public async Task DeleteAsync(string id)
        {
            var filter = Builders<T>.Filter.Eq("_id", id);
            await _collection.DeleteOneAsync(filter);
        }        
    }

在此实现中:

  • 我们将 的实例和集合名称注入构造函数中。IMongoDatabase
  • 我们利用 MongoDB .NET 驱动程序提供的接口与集合进行交互。IMongoCollection<T>
  • 我们使用 MongoDB .NET 驱动程序的功能实现接口中定义的方法,用于 CRUD 操作。IRepository<T>

3. 使用示例

现在,让我们看看如何在典型的 ASP.NET Core 应用程序中使用通用 MongoDB 存储库:

public class CarService
{
    private readonly IRepository<CarEntity> _repository;

    public ExampleService(IRepository<CarEntity> repository)
    {
        _repository = repository;
    }

    public async Task<IEnumerable<CarEntity>> GetAllExamples()
    {
        return await _repository.GetAllAsync(null, 10);
    }
}

在此示例中,是要使用的任何实体类型的占位符。CarEntity

让我们不要忘记program.cs和应用程序设置

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .ConfigureServices((hostContext, services) =>
                {
                    // Configure MongoDB
                    var mongoConnectionString = hostContext.Configuration.GetConnectionString("MongoDB");
                    var mongoClient = new MongoClient(mongoConnectionString);
                    var mongoDatabase = mongoClient.GetDatabase("YourDatabaseName");

                    // Register MongoDB repository
                    services.AddSingleton<IMongoDatabase>(mongoDatabase);
                    services.AddScoped(typeof(IRepository<>), typeof(MongoRepository<>));
                });
    }
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MongoDB": "mongodb://localhost:27017"
  }
}

结论

在 ASP.NET Core 中实现通用 MongoDB 存储库模式提供了一种干净的模块化数据访问方法,从而提高了代码的可重用性和可测试性。通过将数据访问逻辑与应用程序的其余部分分开,您可以轻松地在不同的数据存储解决方案之间切换或更改基础数据访问代码,而不会影响整个应用程序结构。提供的实现为构建具有 MongoDB 集成的可扩展和可维护 ASP.NET 核心应用程序奠定了坚实的基础。

相关推荐

了解Linux目录,那你就了解了一半的Linux系统

大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...

Linux命令,这些操作要注意!(linux命令?)

刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...

Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!

在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...

linux必学的60个命令(linux必学的20个命令)

以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

15 个实用 Linux 命令(linux命令用法及举例)

Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...

Linux 常用命令集合(linux常用命令全集)

系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux常用文件操作命令(linux常用文件操作命令有哪些)

ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...

Linux 常用命令(linux常用命令)

日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E&#...

简单粗暴收藏版:Linux常用命令大汇总

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...

「Linux」linux常用基本命令(linux常用基本命令和用法)

Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...

Linux的常用命令就是记不住,怎么办?于是推出了这套教程

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux的30个常用命令汇总,运维大神必掌握技能!

以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...

Linux/Unix 系统中非常常用的命令

Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...