mongodb-generic-repository

mongodb-generic-repository

MongoDB通用仓储模式实现数据操作简化

MongoDbGenericRepository是基于MongoDB C# Sharp 2.0驱动的通用仓储实现。该项目提供异步操作、分区集合和索引管理功能,简化MongoDB数据操作。支持自定义文档类型,经过400多个集成测试验证。适用于.NET开发者高效管理MongoDB数据,尤其适合构建可扩展SaaS应用。

MongoDBC#通用仓储数据库操作开源项目Github

MongoDbGenericRepository

这是一个使用MongoDB C# Sharp 2.0驱动程序(异步)实现的通用仓储示例

现已作为nuget包提供: https://www.nuget.org/packages/MongoDbGenericRepository/

有400多个集成测试覆盖,并且还在增加。

MongoDbGenericRepository也在AspNetCore.Identity.MongoDbCore中使用。

支持本项目

如果你发现这个项目对你有帮助,无论是作为你使用的库还是学习工具,请考虑为Alex买杯咖啡: <a href="https://www.buymeacoffee.com/zeitquest" target="_blank"><img height="40px" src="https://yellow-cdn.veclightyear.com/0a4dffa0/efdf2d0f-24c0-4ae8-9d97-f29b0327b0ba.png" alt="Buy Me A Coffee" style="max-height: 51px;width: 150px !important;" ></a>

值得注意的事项

这个包默认将MongoDefaults.GuidRepresentation设置为MongoDB.Bson.GuidRepresentation.Standard,而不是驱动程序的默认设置MongoDB.Bson.GuidRepresentation.CSharpLegacy。如果你之前在现有应用程序中使用过该驱动程序,或者正在使用CosmosDB,这可能会导致问题。

你可以在应用程序启动例程中覆盖此行为,以强制使用旧版行为,如下所示:

MongoDbContext.SetGuidRepresentation(MongoDB.Bson.GuidRepresentation.CSharpLegacy)。更多信息在此

使用示例

这个仓储旨在被继承。

你负责管理其生命周期,建议将此仓储设置为单例。

以下是仓储使用的示例,其中TestRepository实现了2个自定义方法:

public interface ITestRepository : IBaseMongoRepository { void DropTestCollection<TDocument>(); void DropTestCollection<TDocument>(string partitionKey); } public class TestRepository : BaseMongoRepository, ITestRepository { public TestRepository(string connectionString, string databaseName) : base(connectionString, databaseName) { } public void DropTestCollection<TDocument>() { MongoDbContext.DropCollection<TDocument>(); } public void DropTestCollection<TDocument>(string partitionKey) { MongoDbContext.DropCollection<TDocument>(partitionKey); } }

如果你的所有文档都有相同类型的Id,你可以使用更具体的BaseMongoRepository<TKey>,其中TKey是你文档的Id类型。

public class TestTKeyRepository<TKey> : BaseMongoRepository<TKey>, ITestRepository<TKey> where TKey : IEquatable<TKey> { const string connectionString = "mongodb://localhost:27017/MongoDbTests"; private static readonly ITestRepository<TKey> _instance = new TestTKeyRepository<TKey>(connectionString); /// <inheritdoc /> private TestTKeyRepository(string connectionString) : base(connectionString) { } }

实例化

可以按如下方式实例化仓储:

ITestRepository testRepository = new TestRepository(connectionString, "MongoDbTests"); ITestRepository<TKey> testTKeyRepository = new TestTKeyRepository<TKey>(connectionString);

如果你更喜欢在整个应用程序中重用同一个MongoDB数据库,你可以使用实现IMongoDatabase接口的MongoDB驱动程序的MongoDatabase:

var client = new MongoClient(connectionString); var mongoDbDatabase = Client.GetDatabase(databaseName); ITestRepository testRepository = new TestRepository(mongoDbDatabase);

添加文档

要添加文档,其类必须继承自Document类,实现IDocumentIDocument<TKey>接口:

public class MyDocument : Document { public MyDocument() { Version = 2; // 如果随时间更改文档架构,可以提高文档版本 } public string SomeContent { get; set; } }

IDocumentIDocument<TKey>接口如下所示:

/// <summary> /// 这个类代表可以存储在MongoDB中的基本文档。 /// 你的文档必须实现这个类,以便MongoDbRepository能够处理它们。 /// </summary> public interface IDocument { Guid Id { get; set; } int Version { get; set; } } /// <summary> /// 这个类代表可以存储在MongoDB中的基本文档。 /// 你的文档必须实现这个类,以便MongoDbRepository能够处理它们。 /// </summary> public interface IDocument<TKey> where TKey : IEquatable<TKey> { /// <summary> /// 主键,如果你希望MongoDB C#驱动程序将其视为文档ID,则必须用[BsonId]属性修饰。 /// </summary> [BsonId] TKey Id { get; set; } /// <summary> /// 版本号,用于指示架构的版本。 /// </summary> int Version { get; set; } }

分区集合

此仓储还允许你将文档分区到多个集合中,这在运行SaaS应用程序并希望保持良好性能时很有用。

要使用分区集合,你必须使用实现IPartitionedDocument接口的PartitionedDocument类来定义你的文档:

public class MyPartitionedDocument : PartitionedDocument { public MyPartitionedDocument(string myPartitionKey) : base(myPartitionKey) { Version = 1; } public string SomeContent { get; set; } }

这个分区键将作为您集合名称的前缀。 集合名称是由文档类型的名称派生而来的,设置为驼峰命名法,并使用 Humanizer (https://github.com/Humanizr/Humanizer) 中的一个类进行复数化。

var myDoc = new MyPartitionedDocument("myPartitionKey"); _testRepository.AddOne(myDoc);

上面的代码将生成一个名为 myPartitionKey-myPartitionedDocuments 的集合。

CollectionName 特性

现在可以使用 CollectionName 特性来更改集合名称:

[CollectionName("MyCollectionName")] public class MyDocument : Document { public MyDocument() { Version = 2; } public string SomeContent { get; set; } }

这种类型的文档将被插入到名为 "MyCollectionName" 的集合中。

索引管理

从版本 1.3.8 开始,MongoDbGenericRepository 实现了 IBaseMongoRepository_IndexIBaseMongoRepository_Index<TKey> 接口。 这暴露了以通用方式对集合进行编程式索引管理的功能。

以下方法已暴露并经过完整的集成测试:

  • CreateAscendingIndexAsync
  • CreateDescendingIndexAsync
  • CreateCombinedTextIndexAsync
  • CreateHashedIndexAsync
  • CreateTextIndexAsync
  • DropIndexAsync
  • GetIndexesNamesAsync

使用示例:

string expectedIndexName = $"myCustomIndexName"; var option = new IndexCreationOptions { Name = expectedIndexName }; // 执行 // 对文档的 Version 属性创建文本索引。 var result = await SUT.CreateTextIndexAsync<T, TKey>(x => x.Version, option, PartitionKey); // 断言 var listOfIndexNames = await SUT.GetIndexesNamesAsync<T, TKey>(PartitionKey); Assert.Contains(expectedIndexName, listOfIndexNames); // 清理 await SUT.DropIndexAsync<T, TKey>(expectedIndexName, PartitionKey);

请参考 IntegrationTests (NET45) 和 CoreIntegrationTests (netstandard2.0) 项目以获取更多使用示例。 CoreIntegrationTests.Infrastructure.MongoDbTKeyDocumentTestBase<T, TKey> 测试类是一个很好的起点。

作者

Alexandre Spieser

许可证

mongodb-generic-repository 使用 MIT 许可证 - http://www.opensource.org/licenses/mit-license.php

MIT 许可证 (MIT)

版权所有 (c) 2016-2019 Alexandre Spieser

特此免费授予任何获得本软件副本和相关文档文件(下称"软件")的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本,以及再授权被配发了本软件的人如上的权利,须在下列条件下:

上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。

本软件是"如此"提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和非侵权性的保证。在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。

==============================================================================

Inflector (https://github.com/srkirkland/Inflector) MIT 许可证 (MIT) 版权所有 (c) 2013 Scott Kirkland

==============================================================================

Humanizer (https://github.com/Humanizr/Humanizer) MIT 许可证 (MIT) 版权所有 (c) 2012-2014 Mehdi Khalili (http://omar.io)

==============================================================================

版权

版权所有 © 2019

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多