之前写过一篇关于MongoDB的封装 发现太过繁琐 于是打算从新写一篇简易版

1:关于MongoDB的安装请自行百度,进行权限认证的时候有一个小坑,3.0之后授权认证方式默认的SCRAM-SHA-1模式,

需要首先命令创建一个用户,然后Drop掉这个用户,然后修改system.version里的authScheam为3,在没有创建用户的情况下

authScheam的值貌似是查询不到的。

修改成3后,授权验证方式就变成了MONGODB-CR

 2:建立一个聚合根和实体

 public interface ICore
{
string Id { set; get; }
} /// <summary>
/// 聚合根
/// </summary>
public interface IAggregateRoot
{
string Id { set; get; }
} /// <summary>
/// 实体
/// </summary>
public abstract class Core : ICore
{
public string Id { set; get; } = Guid.NewGuid().ToString();
}

3:建立实体

/// <summary>
/// 用户
/// </summary>
public class User : Core, IAggregateRoot
{
/// <summary>
/// 名字
/// </summary>
public string Name { set; get; } /// <summary>
/// 身份证
/// </summary>
public string Cardcertificate { set; get; } /// <summary>
/// 性别
/// </summary>
public Gender Gender { set; get; } = Gender.Boy; /// <summary>
/// 用户的房屋信息
/// </summary>
public List<House> Houses { set; get; } = new List<House>();
} public class House : Core
{
public string Adress { set; get; }
} public enum Gender
{
Boy = ,
Gril =
}

4:建立一个接口Context似于EF的DBContext

    public interface IMongoDBContext
{ /// <summary>
/// 具体的表连接器
/// </summary>
/// <typeparam name="K"></typeparam>
/// <returns></returns>
IMongoCollection<K> DbSet<K>() where K : IAggregateRoot; }

添加一个接口的实现

Client 表示的是Mongodb客户端驱动链接 类似于ADO里的SqlConnection

DataBase 表示的是具体的数据库

DbSet 指定具体的表

MongoCredential 认证授权的加密方式

3:建立一个具体的DBContext

BasicContext  类似于EF里面大家直接链接具体库的DBContext

Users User表的映射

4:建立一个MongoDB访问的扩展类

    public static class MongodbExpansion
{
/// <summary>
/// 单个对象添加
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="collection"></param>
/// <param name="entity"></param>
public static void Add<T>(this IMongoCollection<T> collection, T entity) where T : IAggregateRoot
=> collection.InsertOne(entity); /// <summary>
/// 集合添加
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="collection"></param>
/// <param name="entitys"></param>
public static void AddRange<T>(this IMongoCollection<T> collection, List<T> entitys) where T : IAggregateRoot
=> collection.InsertMany(entitys); /// <summary>
/// entity mongodb需要更新的实体 properts需要更新的集合属性,大小写不限 默认更新整个对象 replace 默认空属性不修改
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="collection"></param>
/// <param name="entity">mongodb需要更新的实体</param>
/// <param name="properts">需要更新的集合属性,大小写不限 默认更新整个对象 </param>
/// <param name="replace">默认对象属性为空时不替换当前值</param>
public static void Update<T>(this IMongoCollection<T> collection, T entity, List<string> properts = null, bool replace = false) where T : IAggregateRoot
{
if (entity == null)
throw new NullReferenceException(); var type = entity.GetType();
///修改的属性集合
var list = new List<UpdateDefinition<T>>(); foreach (var propert in type.GetProperties())
{
if (propert.Name.ToLower() != "id")
{
if (properts == null || properts.Count < || properts.Any(o => o.ToLower() == propert.Name.ToLower()))
{
var replaceValue = propert.GetValue(entity);
if (replaceValue != null)
{
list.Add(Builders<T>.Update.Set(propert.Name, replaceValue));
}
else if (replace)
list.Add(Builders<T>.Update.Set(propert.Name, replaceValue));
}
}
}
#region 有可修改的属性
if (list.Count > )
{
///合并多个修改//new List<UpdateDefinition<T>>() { Builders<T>.Update.Set("Name", "111") }
var builders = Builders<T>.Update.Combine(list);
///执行提交修改
collection.UpdateOne(o => o.Id == entity.Id, builders);
}
#endregion } /// <summary>
/// 移除根据ID
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="collection"></param>
/// <param name="entity"></param>
public static void Remove<T>(this IMongoCollection<T> collection, T entity) where T : IAggregateRoot
=> collection.DeleteOne(o => o.Id == entity.Id); /// <summary>
/// 移除表达式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="collection"></param>
/// <param name="expression"></param>
public static void Remove<T>(this IMongoCollection<T> collection, Expression<Func<T, bool>> expression) where T : IAggregateRoot
=> collection.DeleteOne(expression); public static IFindFluent<T, T> Where<T>(this IMongoCollection<T> collection, Expression<Func<T, bool>> expression)
=> expression == null ? collection.Find(Builders<T>.Filter.Empty) : collection.Find(expression); /// <summary>
/// MongoDB里面是没有实现IQueryable的 所以想要使用习惯的SELECT我们只能自己封装一下
/// </summary>
/// <typeparam name="TDocument"></typeparam>
/// <typeparam name="TProjection"></typeparam>
/// <typeparam name="TNewProjection">返回新的数据类型</typeparam>
/// <param name="IQueryable"></param>
/// <param name="projection"></param>
/// <returns></returns>
public static IFindFluent<TDocument, TNewProjection> Select<TDocument, TProjection, TNewProjection>(this IFindFluent<TDocument, TProjection> IQueryable, Expression<Func<TDocument, TNewProjection>> projection)
=> IQueryable.Project(projection); /// <summary>
/// 获得筛选后的首个元素
/// </summary>
/// <typeparam name="TDocument"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="IQueryable"></param>
/// <returns></returns>
public static T FirstOrDefault<TDocument, T>(this IFindFluent<TDocument, T> IQueryable)
=> IQueryable.First(); /// <summary>
/// 直接支持表达式树后的首个满足对象
/// </summary>
/// <typeparam name="TDocument"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="collection"></param>
/// <param name="expression"></param>
/// <returns></returns>
public static T FirstOrDefault<TDocument, T>(this IMongoCollection<T> collection, Expression<Func<T, bool>> expression = null)
=> expression == null ? collection.Find(Builders<T>.Filter.Empty).First() : collection.Find(expression).First();
}
Builders<T>.Update.Combine 方法是将多个UpdateDefinition<T>修改设置合并成一个builder对象执行

IFindFluent 所返回的都是MongoDB执行的命令

MongoDB客户端驱动也是支持异步操作的我这里就没有写了 有兴趣的可以自己研究下

5:建立测试仓储

6:仓储的实现  是不是看起来有点EF的感觉? ~0~

7:建立Service接口

8 领域服务的实现

9:单元测试用例

 BasicContext Context = new BasicContext();
Context.Users.Add(new Entity.User()
{
Name = "小七子",
Cardcertificate = "",
Gender = Entity.Gender.Boy,
Houses = new System.Collections.Generic.List<Entity.House>() { new Entity.House() { Adress = "中关村110号双拼别墅" } }
}); Context.Users.Where(o => o.Cardcertificate == "").ToList(); Context.Users.Update(new Entity.User() { }); Context.Users.Remove(new Entity.User() { }); Context.Users.Where().Select(o => o.Name).ToList();
Console.ReadKey();

 

MongoDB 系列(一) C# 简易入门封装的更多相关文章

  1. 不用搭环境的10分钟AngularJS指令简易入门01(含例子)

    不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...

  2. MongoDB系列(二):C#应用

    前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...

  3. 孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5

    孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongo ...

  4. 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4

    孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...

  5. 孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3

    孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十天. 今天继续学习mongoDB的简单操作, ...

  6. 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2

    孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第九天. 今天继续学习mongoDB的简单操作, ...

  7. 孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1

    孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第八天. 今天开始学习mongoDB的简单操作, ...

  8. mongodb系列之-治理mongodb->db.currentOp()

    mongodb系列之-管理mongodb->db.currentOp() 管理mongodb->db.currentOp(), 绝对是原创... 今天公司的dba在内部分享了针对mysql ...

  9. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)

    前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...

随机推荐

  1. js的for循环闭包问题

    一个简单的例子,如果想循环输出数组中的每一个数值我们可以利用for循环来输出例如: <script type="text/javascript"> var arr=[& ...

  2. Codility---MaxProfit

    Task description A zero-indexed array A consisting of N integers is given. It contains daily prices ...

  3. Mac OS 的命令行 总结

    du 命令 查看目录下所有文件的大小: du -sh * ls 命令 直接显示当前目录下的所有的非隐藏文件: ls // 怎么在文章中显示不出来?? 显示当前目录下的所有的文件(包括隐藏的): ls ...

  4. Akka(7): FSM:通过状态变化来转换运算行为

    在上篇讨论里我们提到了become/unbecome.由于它们本质上是堆栈操作,所以只能在较少的状态切换下才能保证堆栈操作的协调及维持程序的清晰逻辑.对于比较复杂的程序流程,Akka提供了FSM:一种 ...

  5. JavaScript实现图片拖拽、粘贴上传

    前些日子为老婆做了一个web管理商品的工具,因为商品的图片比较多并且还需要剪裁图,为了上传图片方便加了一个拖拽.粘贴上传的功能. 我已经把代码整理出来放到GitHub上了,有兴趣的朋友可以下来玩玩. ...

  6. MVC分层含义与开发方式

    真正的服务层是面向数据的,假想一切数据都是从参数获得 控制层是接受页面层数据,再传给服务层,然后将结果返回给页面层的(客户) 页面层是提交格式化的数据的(容易小混乱,无格式,所以要格式化,可以在中间加 ...

  7. 一致性Hash算法与代码实现

    一致性Hash算法: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值 ...

  8. eclipse debug URLClassPath.getLoader(int) file

    版权声明:本文为博主原创文章,未经博主允许不得转载. URLClassPath.getLoader 在用Eclipse调试Java程序时,新手遇到的一个问题是断点老是执行不到,弹出URLClassPa ...

  9. .net 4.0 中的特性总结(三):垃圾回收

    1.内存基础知识 每个进程都有其自己单独的虚拟地址空间. 同一台计算机上的所有进程共享相同的物理内存,如果有页文件,则也共享页文件. 默认情况下,32 位计算机上的每个进程都具有 2 GB 的用户模式 ...

  10. curl的使用

    curl -v -0  -T 123.wav   "127.0.0.1:80/saveSound?filename=18696770041_1379903830_xxx.wav&du ...