这是一个使用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
类,实现IDocument
或IDocument<TKey>
接口:
public class MyDocument : Document { public MyDocument() { Version = 2; // 如果随时间更改文档架构,可以提高文档版本 } public string SomeContent { get; set; } }
IDocument
和IDocument<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("MyCollectionName")] public class MyDocument : Document { public MyDocument() { Version = 2; } public string SomeContent { get; set; } }
这种类型的文档将被插入到名为 "MyCollectionName" 的集合中。
从版本 1.3.8 开始,MongoDbGenericRepository
实现了 IBaseMongoRepository_Index
和 IBaseMongoRepository_Index<TKey>
接口。
这暴露了以通用方式对集合进行编程式索引管理的功能。
以下方法已暴露并经过完整的集成测试:
使用示例:
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
AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面, 适合各类写作者提升内容品质和工作效率。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍 全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公 和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一 款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总 结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号