低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

针对.NET 平台的 MongoRepository 一瞥

2014 年 11 月 10 日

我们在 InfoQ 上跟读者分享的大部分开源项目,都是增强另一个库、或是另一种技术的功能。但是 MongoRepository 与它们不同,因为它有意限制了底层库的功能。我们让其作者 Rob Janssen 自己说一下,为什么这样做。

InfoQ:MongoDB 针对.NET 提供了非常丰富的 API。你认为使用 MongoRepository 而不用现成的 Mongo 驱动程序,主要原因是什么?

Rob Janssen:让我惊讶的是所有的采访都会问我这个(我认为在我的作品中(Github、Codeplex、Nuget……)还有其他一些“更有趣的”项目,比如 NGeoNames NIdenticon TwoFactorAuth Fop2DD 等)。

尽管 MongoRepository 的 API 具有很好的文档,但是还远没有达到丰富的程度。事实上,它设法尽可能的小。所有困难的工作都是由 Robert Stam、Craig Wilson 以及其他一些贡献者完成的,因为他们已经实现了基础的 MongoDB 驱动程序。MongoRepository 仅仅是它上面很薄的一层,或者说是抽象。MongoRepository 起初是由 tgeek 发起的,但是自从我开始为这个项目贡献代码以来,差不多就算接管了它;到现在,关于 MongoRepository,他既没有太多的提交,也没有太多的反馈(对我来说,这也没什么)。

对我来说,MongoRepository 存在的原因很简单:它在底层的 MongoCSharp Driver 之上提供了一个很紧凑的抽象,它提供了一个简单的接口,主要用来隐藏 MongoCSharp Driver 提供的多得令人恐惧的功能,并且提供了基础的 CRUD 操作。通过这种方式,你就不太会倾向于使用各种 Mongo 特定的功能特性,这样项目和 Mongo 之间的耦合也会降到最低,因此一旦有人决定使用不同的持久化层,“切换”会更容易。但是不要误解我;MongoDB 是很好的产品,提供了很好的功能特性,驱动很干净,运行很快,而且确实是经过精心优化的。但是有时候你想控制这些好东西的诱惑,并提供一个更简单、更统一的接口来与之交互。MongoRepository 恰恰做了这事:它主要提供了一个仓库模式接口,仅此而已。它提供了 RepositoryManager 类,这个类尽量隐藏了一些 Mongo 特定的功能,并且它确实也提供了一些方法让用户能够更深入一点,但是我还是尽量将这些方法与 MongoDB 的耦合降到最低。但是抽象有时候还是会泄漏底层细节。MongoRepository 也一样。

InfoQ:你认为 MongoDB 有没有缺失一些低层的功能特性?如果那些功能特性存在,会不会对 MongoRepository 和其他一些使用它的项目有好处呢?

Rob Janssen:目前,我认为 MongoDB 没有缺失任何低层的功能特性;不管是全局的,还是 MongoRepository 特定的也好。对我来说,一个仓库需要至少支持增加、获取、更新和删除(CRUD)这四个操作,而 MongoDB 恰恰很好地支持了这些操作。其他一些操作也是很好的,但是超越了“仓库模式范围”。除了 MongoRepository, MongoDB 我用的也比较多,确实没感觉缺少什么功能特性。早期的版本(pre 2.0 或者 2.2)有一些问题和奇怪的行为,但是据我所知,这些问题已经被修复、改进或者改善了。LINQ 的威力,加上 MongoCSharpDriver 已经完成的困难的工作,使得在 MongoRepository 端不需要完成太多的工作,就能使它成为一个强大的库。

InfoQ:MongoDB 使用它自己的一套序列化属性,比如 BsonElement,而不是尊崇 DataContract/DataMember。你赞同这样的决定还是更喜欢它们与标准保持一致?

Rob Janssen:BsonElement 来自于底层的 MongoCSharpDriver。我仍然需要找时间重构这一部分,以便把它改成 MongoRepository 特定的属性,但是目前还没有时间。而且我现在还没有想好如何实现。通常只有想到一个极好的(“最好的”)解决方案的时候,我才会考虑这些问题,但是到目前为止,还没有很好的解决方案。不管怎样,对讨论和建议我都是开放的,因此任何有想法的人都欢迎来分享。

MongoRepository 基于 MIT 许可证提供。

如果想推荐其他一些你觉得应该让 InfoQ 重点介绍的开源项目,可以通过 _jonathan@infoq.com_ 联系 _Jonathan Allen__。_

查看英文原文: A Look at MongoRepository for .NET


感谢臧秀涛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 11 月 10 日 11:071251

评论

发布
暂无评论
发现更多内容

Zookeeper Watcher 流程分析(结合源码)

CoderLi

Java zookeeper 源码分析 后端 Watcher

Zookeeper 序列化

CoderLi

Java zookeeper 源码分析 后端

大中台模式下如何构建复杂业务核心状态机组件

奈学教育

中台

食堂就餐卡系统架构设计文档

dony.zhang

ZooKeeper 数据模型:节点的特性与应用

CoderLi

zookeeper 源码分析 数据模型 节点

大中台模式下如何构建复杂业务核心状态机组件

古月木易

Kafka零数据丢失的配置方案

奈学教育

kafka

Libra教程之:Libra协议的关键概念

程序那些事

区块链 libra blockchain 协议

游戏夜读 | 如何制作游戏?

game1night

自由是不是随心所欲?

Neco.W

个人成长 自由 控制

面向对象的三个基本特征(要素)

彭阿三

三要素 三个基本特征 封装、继承、多态

2020年5月云主机性能评测报告

博睿数据

云计算 服务器 公有云 机房 云主机

月薪 3W 的 Apple 微信编辑是这么发文章的 |如何发类似 Apple 微信公众号的文章效果

陈东泽 EuryChen

CSS 微信 前端 apple 微信公众号

架构师训练营作业(第二周)

王海

极客大学架构师训练营

SpringMVC中Http请求方式转换(post转换为put/delete等方式)

知春秋

springmvc post post到put方式请求 post到delete方式请求

如何让程序员变得没朋友

四猿外

程序员 程序员素养 个人感悟 技术人生 经验分享

原创 | TDD工具集:JUnit、AssertJ和Mockito (二十一)编写测试-测试模板

编程道与术

Java 编程 TDD 单元测试 JUNI

副业月赚 10 万的程序员是如何做销售的?

非著名程序员

程序员 独立开发者 程序人生 提升认知 程序员成长

机器学习算法评估指标—2D语义分割

做技术BP的文案Gou

学习 2D 评估标准 语义分割

架构师训练营学习总结——框架设计【第二周】

王海

极客大学架构师训练营

Zookeeper-Access Control List(ACL)

CoderLi

Java zookeeper 源码分析 后端

Libra白皮书解读

程序那些事

区块链 facebook 数字货币 libra

[架构师训练营] Week01 - 食堂就餐卡系统设计

谭方敏

学习

迄今为止讲解最详细的Tomcat架构解析与JVM、GC详解及调优文档

周老师

Java tomcat 程序员 Web

Java 序列化

CoderLi

Java 程序员 后端 序列化

互金总结系列(1)--开篇

互金从业者X

做产品少走弯路:上帝视角(2)

我是IT民工

产品 方法 路径 知识体系

Java | 原来 serialVersionUID 的用处在这里

YoungZY

Java

2w字长文!手撸一套 Java 基础面试题

cxuan

Java 后端 Java25周年

原创下载 | TDD工具集原创开源代码免费下载!

编程道与术

Java 开源 TDD 下载 代码

如何基于 OAM 编写一个扩展 Trait?

钱王骞

云原生 k8s OAM

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

针对.NET平台的MongoRepository一瞥-InfoQ