针对.NET平台的MongoRepository一瞥

我们在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重点介绍的开源项目,可以通过[email protected]联系Jonathan Allen

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

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

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

你可能感兴趣的:(针对.NET平台的MongoRepository一瞥)