MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 一
本人系新接触MongoDB不久,属于MongoDB的菜鸟范畴。在使用MongoDB的过程中,总结了一些认识,在此总结跟大家分享。欢迎拍砖。
关于MongoDB的内容,在此就不做介绍了,网上有浩如烟海的文章介绍。本人不善理论,不妥之处,望指正。
想法来由:本人之前主要使用EF的CodeFirst方式做一些开发,EF的优劣在此不做评述。但已经习惯了EF式的代码编写方式,所以做了一个小的框架,来模拟实现类似EF代码风格,以减少开发者在实际使用过程中对MongoDB的关注和维护。为其取名为MongoDB.Repository。
中心思想:在使用的过程中不必关心任何的MongoDB的内容。
在此先介绍一下MongoDB.Repository的使用方式
使用过EF的朋友应该比较熟悉EF的风格,DBContext和ModelDesign是EF的主要构成部分,在此我也设计了一个IMongoDBContext和IEntity两个接口,
public interface IMongoDBContext
{
/// <summary>
/// register entity type
/// </summary>
/// <param name="registration"></param>
void OnRegisterModel(ITypeRegistration registration); /// <summary>
/// name of ConnectionString in config file
/// </summary>
string ConnectionStringName { get; } /// <summary>
/// build Configuration by config file
/// </summary>
/// <returns></returns>
IConfigurationRegistration BuildConfiguration();
}
public interface IEntity
{
/// <summary>
/// mongo id
/// </summary>
string Id { get; set; }
/// <summary>
/// save document
/// </summary>
void Save();
/// <summary>
/// remove document
/// </summary>
void Remove();
}
IMongoDBContext为上下文,在该上下文中必须实现OnRegisterModel方法,以注册需要在框架中使用的模型,未注册的模型将不会在MongoDB中体现,以免MongoDB的Collection出现无法控制的局面。IEntity为具体的实例接口,定义的model均需继承该接口。该接口提供了Save和Remove方法,以方便的保存和删除。为了方便使用,框架提供了针对于上述两个接口的抽象实现MongoDBContext和Entity。
在使用时,只需先注册当前上下文,再注册需要维护的CollectionType,后面即可以Entity.Save()的方式操作数据库。
下面给出实操代码:
public class Student : Entity
{
public string Name { get; set; }
public int Age { get; set; }
}
public class TestDBContext : MongoDBContext
{
//TestDBContext即配置文件中的节点的名称
public TestDBContext() : base("TestDBContext") { } public override void OnRegisterModel(ITypeRegistration registration)
{
registration.RegisterType<Student>();//在上下文中注册可用的实例
}
}
public void Setup()
{
MongoDBRepository.RegisterMongoDBContext(new TestDBContext());//注册上下文
Student student = new Student();
student.Name = "hyf";
student.Age = 30;
student.Save();//保存当前实例到数据库
student.Remove()//删除当前实例
}
配置文件如下:
<connectionStrings>
<add name="TestDBContext" connectionString="mongodb://localhost:27017/TestMongo"/>
</connectionStrings>
如上,除了Save和Remove,还有就是Get和Select。框架提供了一些查询的扩展方法,使用如下:
//获取实例
var stud = Entity.Get<Student>(student.Id);
var stud = Entity.Get<Student>(s=>s.Age=="hyf");
//分页查询
var querable = Entity.Select<Student>(s => s.Age >= 19 && s.Age <= 22, s => s.Age, 1, 2, out pageCount, out allCount).ToList(); //批量删除
Entity.RemoveAll<Student>(e => e.Name == "hyf"); //批量保存
Entity.Save(new List<Student>() {
new Student{ Name="hyf", Age=33 },
new Student{ Name="zhc", Age=30 }
});
通过以上操作,可以完成一些简单CURD操作,甚至构建一个简单的系统应用。
在使用中,只需在config中配置MongoDB即可,其余关于MongoDB的任何内容不用关心。
这只是本人对MongoDB的一些初探,源码并没有任何的技术含量,欢迎大家拍砖并提出更好的设计理念。
源码地址 (源码基于MongoDB的官方驱动,VS2012开发,源码已经提交至github)
MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 一的更多相关文章
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 三
本次改动的主要内容是实现MongoDB.Repository在MongoDB中建立索引. 建立索引主要使用MongoDB的官方驱动中EnsureIndex方法. 在MongoDB.Repository ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作
本次主要内容:修正MongoDB.Repository框架对多数据库的支持. 在之前的五篇文章中对MongoDB.Repository框架做了简单的介绍是实现思路.之前是考虑MongoDB.Repos ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 二
本次改动的主要内容是实现MongoDB.Repository对MongoDBRef的支持. MongoDB对一对一,一对多,多对多关系的维护,官方推荐文档嵌入方式,反映到模型的设计如下: public ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 --- 为List<MongoDBRef>增加扩展方法
本次改动主要内容:为List<MongoDBRef>增加扩展方法 在MongoDB.Repository的使用过程中,发现在一个类中只定义一个List<MongoDBRef>是 ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 四
本次改动主要实现MongoGridFS功能.实现方式主要使用了MongoGridFS和MongoGridFSFileInfo两个类. 设计思路:定义一个IMongoFile接口并继承IEntity,以 ...
- MongoDB Python官方驱动 PyMongo 的简单封装
最近,需要使用 Python 对 MongodB 做一些简单的操作,不想使用各种繁重的框架.出于可重用性的考虑,想对 MongoDB Python 官方驱动 PyMongo 做下简单封装,百度一如既往 ...
- 在.net下打造mongoDb基于官方驱动最新版本
还是一如既往先把结构图放出来,上上个版本添加了redis的缓存,但是不满足我的需求,因为公司有项目要求是分布式所以呢,这里我就增加了mongoDb进行缓存分布式,好了先看结构图. 总的来说比较蛋疼,因 ...
- 使用MongoDB C#官方驱动操作MongoDB
想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...
- 在C#中使用官方驱动操作MongoDB
MongoDB的官方驱动下载地址:https://github.com/mongodb/mongo-csharp-driver/releases 目前最新的版本是2.10,支持.NET 4.5以上.由 ...
随机推荐
- Linq的Distinct太不给力了[转]
假设我们有一个类:Product public class Product { public string Id { get; set; } public string Name { get; set ...
- C#记录日志、获取枚举值 等通用函数列表
) { ] >= && ipvals[] <= && ipval ...
- 华为机试 之 joseph环
一:首先科普一下约瑟夫问题的数学方法 (1) 不管是用list实现还是用vector实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比較烦,并且时间复杂度高达O(nm),当n,m很大(比如上百 ...
- 【百度地图API】北京周边7日游——图标按路线轨迹行动
原文:[百度地图API]北京周边7日游--图标按路线轨迹行动 任务描述: 春节就要来啦~酸奶小妹的妈妈要从遥远的重庆,来到北京过春节呢!酸奶小妹忙着给妈妈计划,北京周边的旅游线路.计划好路线后,就开始 ...
- SQL2005性能分析一些细节功能你是否有用到?
原文:SQL2005性能分析一些细节功能你是否有用到? 我相信很多朋友对现在越来越大的数据量而感到苦恼,可是总要面对现实啊,包括本人在内的数据库菜鸟们在开发B/S程序时,往往只会关心自己的数据是否正确 ...
- REDGATE SQL TEST的使用
原文:REDGATE SQL TEST的使用 REDGATE SQL TEST的使用 SQL TEST下载和破解可以参考这篇文章:http://www.cnblogs.com/VAllen/archi ...
- 在 CentOS 上安装 Tomcat7
1. 下载 #可以直接在官网下载然后传到服务器上,也可以直接下载#下载地址:http://tomcat.apache.org/download-70.cgi 2. 安装 # tar -xzvf apa ...
- 高德地图教程_poi搜索和显示
通过高仿深圳的应用近期打算.UI我们已经做了,我见过APP查询界面.关闭网络也将是能够查询其指示数据被存储在数据库中,或者是第一网络,所有网站上的数据是好了.我想简单地使用查询地图提供了. 曾经是接触 ...
- SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务
原文:SQL点滴9-SQL Server中的事务处理以及SSIS中的内建事务 我们可以把SSIS中的整个package包含在一个事务中,但是如果在package的执行过程中有一个表需要锁定应该怎么处理 ...
- Java 之关键字 null 使用总结
1.null的使用 Java中,null是一个关键字,用来标识一个不确定的对象.因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量.比如我们在定义一个变量的时候我们通过会这样做:X ...