之前写过一篇关于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. Winform调用WebKitBrowser,基于chrome内核WebKit的浏览器控件

    在C#中,默认的WebBrowser控件默认使用的是IE的core,而IE的种种遭人吐槽的诟病使我不敢轻易使用WebBrowser,因此,打算使用Chrome的内核替换IE.Chrome的内核使用的是 ...

  2. 移动端使用rem同时适应安卓ios手机原理解析,移动端响应式开发

    rem单位大家可能已经很熟悉,rem是随着html的字体大小来显示代表宽度的方法,我们怎样进行移动端响应式开发呢 浏览器默认的字体大小为16px 及1rem 等于 16px 如果我们想要使1rem等于 ...

  3. spring异常处理器

    一.本篇文章旨在讨论异常处理器: 1.因为异常处理器在实战中通常用来处理开发人员自定义的运行时异常,所以如果要了解如何自定义运行时异常,请自行搜索相关资料. 2.本文的demo用IndexOutOfB ...

  4. 信号处理——卷积(convolution)的实现

    作者:桂. 时间:2017-03-07  22:33:37 链接:http://www.cnblogs.com/xingshansi/p/6517301.html 前言 信号时域.频域对应关系,及其D ...

  5. CSDN删除上传资源的办法

    转自网友:http://blog.csdn.net/ssergsw/article/details/12489101 我按照下面的方法一试,果然成功了. 昨天晚上进行测试,上传了一个压缩包和大家分享, ...

  6. 利用浏览器查找font-family的css编码

    提供一种利用Chrome快速查找字体编码的小技巧 打开浏览器,按下键盘F12 点击Console控制台 输入escape("要查询的字体中文名称")(注意:括号与引号都是英文输入法 ...

  7. c++字符串的输入的思考

    字符串的输入,是学习c++的一个重点,也是一个极富有细节意味的知识点,如果你不了解这些细节,你可能会在写程序时犯错而一脸懵逼不知所措. 与此同时,我们要了解c++缓冲区的概念,程序的输入都建有一个缓冲 ...

  8. Vue-cli 记录

    出自http://www.cnblogs.com/nutritious/p/6494479.html 先给出能正确安装的步骤: 1.进盘符 2,为啥不用npm,这是国外的东西,有些电脑无法FQ,会导致 ...

  9. 使用dom4j讲xml字符串递归遍历成Map

    package test; import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import j ...

  10. 安装nginx+lua开发环境

    一.安装nginx及搭建本地测试环境 1.创建安装目录:    /data/nginx2.安装make:        yum-y install gcc automake autoconf libt ...