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以上.由 ...
随机推荐
- unity3d NGUI入门(描述和使用插件参数)
我用NGUI它是3.5.4,Unity3d版本号是4.3.4f需要 NGUI3.5.4 下载NGUI,这是破解版的,用于学习.假设是商用.请支持正版 插件的导入 1.NGUI的导入,双击NGUI Ne ...
- linux_windows下配置tomcat区别 ,不同子域名映射不同 项目
windows下 均为修改tomcat/bin/server.xml 在最后 替换 注意 docBase / <Realm className="org.apache.catalina ...
- app后端设计(0)--总文件夹
原文:http://blog.csdn.net/newjueqi/article/details/19003775 做了接近两年app相关的系统架构,api设计,先后在两个创业公司中工作,经历过手机网 ...
- mono for android 学习记录
C#开发Android应用实战(全 扫描 中文版) 学习记录: 拖完控件后,不要急着按F5,需要重新生成,才能自动修改 Resource.Designer.cs 文件 1. Activity 是基于a ...
- Socket 学习(二)
1对1的发送和接收 Client 端 void ThreadReceive() { try { ...
- mysql5.6.16绿色版配置、运行
原文:mysql5.6.16绿色版配置.运行 1.从该地址http://dev.mysql.com/downloads/mysql/中选择windows的版本,选择下载. 2.将下载的压缩包解压. 3 ...
- iOS7 UIKit动力学-碰撞特性UICollisionBehavior 上
我们谈到了重力上述财产UIGravityBehavior这个类. 非常明确的看法,当我们添加的属性的严重性后,,苹果UIview像掉进无底洞,地下坠,不断的加速.而如今呢,我们要在这个手机屏幕上,加入 ...
- sql分页查询公式
分页查询公式: select top PageRow(每页显示的数据行数) from 表名 where 主键 not in(select top PageRow*(当前页数-1) 主键 from ...
- Android NDK进入发展
使用互联网有很多javah命令生成一个头文件来完成JNI写,但事实上ADT集成NDK后.点点鼠标就可以了,网上的介绍是非常小懒的方法,在这里,我们主要谈论的懒惰JNI发展. 为ADT组态NDK.请个人 ...
- Spring之SpringMVC的RequestToViewNameTranslator(源码)分析
前言 SpringMVC如果在处理业务的过程中发生了异常,这个时候是没有一个完整的ModelAndView对象返回的,它应该是怎么样处理呢?或者说应该怎么去获取一个视图然后去展示呢.下面就是要讲的Re ...