之前写过一篇关于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. Hybrid App开发之JavaScript基础

    前言: 前面学习了html和css的基本使用,今天开始学习JavaScript的使用. 什么是JavaScript JavaScript是一种基于对象(Object)和事件驱动(Event Drive ...

  2. 黑马程序员:3分钟带你读懂C/C++学习路线

    随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...

  3. undefined is not an object (evaluating 'RNFetchBlob.DocumentDir')

    参考https://github.com/wkh237/react-native-fetch-blob/issues/51 自己做了一下总结: 这个报错位置在react-native-fetch-bl ...

  4. selenium+python元素操作

    1.判断元素的属性if i.get_attribute('type') == 'checkbox' 2.获取当前窗口的坐标 driver.get_window_position 获取当前窗口的长宽 d ...

  5. if 一元二次方程求根

    if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if...else if... ...

  6. win10 搜索不能使用解决方法

    重装系统之后遇到一个问题,在搜索栏不能搜索到应用程序,Windows 10 Search can't find ANY applications. Even calculator - Super Us ...

  7. EntityFramework Core映射关系详解

    前言 Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关 ...

  8. post和get方式区别

    Ajax中我们经常用到get和post请求.那么什么时候用get请求,什么时候用post方式请求呢? 在做回答前我们首先要了解get和post的区别.1. get是把参数数据队列加到提交表单的ACTI ...

  9. JavaScript事件与例子

    事件,就是预先设置好的一段代码,等到用户触发的时候执行. 一:常见的事件: 1.关于鼠标的事件 onclick 鼠标单击触发 ondblclick 鼠标双击触发 onmouseover 鼠标移上触发 ...

  10. (原创)用JAX-WS+Spring实现简单soap规范的webservice

    转载请注明出处:http://www.cnblogs.com/Starshot/p/7050084.html Soap即简单对象访问协议,也可理解为一种用于程序之间通讯的规范,它主要基于XML和htt ...