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以上.由 ...
随机推荐
- View Component
View Component 在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能. ...
- validateRequest="false"属性及xss攻击
validateRequest="false" 指是否要IIS验证页面提交的非法字符,比如:>,<号等,当我们需要将一定格式得html代码获得,插入数据库时候,就要 ...
- python_基础学习_04_mysql库验证与安装(mysql-python,mysql.connector)
验证python-mysql是否安装 1:python 2: import MySQLdb 安装步骤: 1.sudo apt-get install python-setuptools 2.sudo ...
- 如何监控第三方应用程序(SOAP or RESTful client)访问HTTPS当数据站点?
随着越来越多的互联网应用,在我们日常的开发和调试,其中(例如,调试SOAP和RESTFul什么时候),我们经常需要访问工具,通过第三方获取HTTPS网站.为了简化叙述说明,如本文所用,IE浏览器访问G ...
- [ Alcatraz ]管理Xcode插件
[ Alcatraz 配置 ] 1.包管理器在线安装 Terminal终端 $ curl -fsSL https://raw.githubusercontent.com/supermarin/Alca ...
- tiny210——uboot移植Makefile文章分析
这东西已经写,我们没有时间发布,如今,终于有时间稍微长送记录汇总uboot学习过程.具体了.以后忘了也能够再温习回来嘛有些特殊字符显示得乱掉了 Makefile追踪技巧: 技巧1:能够先从编译目标開始 ...
- tcp接收队列
对于接收数据包,内核维护如下几个队列:1>全局 backlog 队列,驱动程序调用 netif_rx 将接收到的数据包缓存于该队列中.2>sock 结构中 back_log 队列,网络层在 ...
- Swift语言指南(九)--基本运算符
原文:Swift语言指南(九)--基本运算符 运算符(operator)是用来检查,改变或合并值的一种特殊符号或短语.例如,加号运算符让两个数字相加(如:let i = 1 + 2),还有些更复杂的运 ...
- ASP.NET MVC 插件化
ASP.NET MVC 插件化机制 2015-03-14 22:25 by 杨康新, 1328 阅读, 15 评论, 收藏, 编辑 概述 nopCommerce的插件机制的核心是使用BuildMana ...
- Iframe父页面与子页面之间的调用
原文:Iframe父页面与子页面之间的调用 Iframe父页面与子页面之间的调用 专业词语解释如下: Iframe:iframe元素是文档中的文档. window对象: 浏览器会在其打 ...