我们在 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 )关注我们,并与我们的编辑和其他读者朋友交流。
评论