项目类库:.Net Standar 2.0
web:ASP.NET CORE 2.2 版本

先上图,看我们的解决方案结构:

分别对上面的工程进行说明:
1、KYSharpCore:为公共的基础类,最底层

2、KYSharpCore.MongoDB:为公共的MongoDB操作基类

3、DPMS.Model :为demo的实体层/

4、DPMS.Repository:为demo的仓储层/

5、DPMS.Service:为demo的服务层

6、DPMS.Web:为demo的web层项目,MVC框架

KYSharpCore.NPOI:为导出组件,该组件与上面不存在层级关系,为独立的功能组件。

以上工程,必须遵循固定的顺序进行引用,即12345的顺序。

因为1和2是基础类,我们这边不做赘述,将在其他章节中讲述。我们从3开始讲起

约定:公共的类库,我们选择.NET Standar 2.0作为目标框架。可与framework进行共享。

本demo的仓储层、服务层、model层均为 Standar 2.0框架建设。

一、实体层

因为是使用MongoDB,需要引用MongoDB.Bson.

Nuget上引用:

1、创建一个实体基类EntityBase,设置公共字段

namespace DPMS.Model
{
public class EntityBase
{
/// <summary>
/// MongoDB系统自带的主键
/// </summary>
[Key]
public ObjectId _id { get; set; } /// <summary>
/// 用于接收自增的数字ID
/// </summary>
public int ID { get;set;} /// <summary>
/// 添加时间
/// </summary>
public DateTime AddTime { get; set; } = DateTime.Now;
}
}

2、新建一个需求实体 Invest

namespace DPMS.Model
{
/// <summary>
/// 需求表
/// </summary>
public class Invest:EntityBase
{
/// <summary>
/// 团队代码
/// </summary>
public string TeamCode { get; set; } /// <summary>
/// 团队负责人 拼音,与企业微信一致
/// </summary>
public string TeamLeader { get; set; } /// <summary>
/// 禅道-需求编号
/// </summary>
public string CD_No { get; set; } /// <summary>
/// 禅道-归属产品名称
/// </summary>
public string CD_Product { get; set; } /// <summary>
/// 禅道-需求标题
/// </summary>
public string CD_Title { get; set; } /// <summary>
/// 需求发布者,产品经理
/// </summary>
public string Producter { get; set; } /// <summary>
/// 产品经理名称
/// </summary>
public string ProducterName { get; set; } /// <summary>
/// SM确认的状态 0:无 1:按时完成 2:完成但延时 3:非本月需完成 4:未完成
/// </summary>
public int SM_Status { get; set; } = ; /// <summary>
/// 产品经理确认的状态
/// </summary>
public int Pro_Status { get; set; } = ; /// <summary>
/// 归属月份,格式YYYYMM,201906
/// </summary>
public string Month { get; set; }
}
}

demo中的实体就这样了

二、仓储层

仓储层需要引用KYSharpCore和KYSharpCore.MongoDB 两个基类,以及Model层

为什么选择用仓储,原因很简单,方便我们进行个性化扩展。在数据操作的底层进行其他个性化逻辑处理。

约定:

1、接口的定义放在根目录下,接口的实现类,统一放到Impl文件夹,表示实现类目录。

2、每个实体,对应一个仓储的接口和实现类,即有多少个实体,就对应创建多少个接口和实现类。

我们新建一个Invest的仓储接口 IInvestRepository.cs

namespace DPMS.Repository
{
public interface IInvestRepository:IRepository<Invest>
{
}
}

继承了KYSharpCore.MongoDB中的仓储接口

接着在Impl中新建一个Invest的仓储实现InvestRepository.cs

namespace DPMS.Repository.Impl
{
public class InvestRepository:Repository<Invest>,IInvestRepository
{
public InvestRepository(DbContextBase dbContext) : base(dbContext)
{
} }
}

该实现同时继承KYSharpCore.MongoDB中的仓储实现类,以及invest的接口。此时,InvestRepository就已经实现了各种关于MongoDB增删改查的的基础方法。

大家会发现,仓储层构造函数是带参数的,需要有DbContextBase,此为数据库上下文对象。所以在web端,需要对数据库上下文进行注入。下面web内容会讲。

三、服务层

服务层在仓储层基础上,增加仓储层的引用。

服务层与仓储层类似,它属于藏储层的使用者。定义的方式与藏储层类似,有接口和Impl实现目录。

但服务层不需要一个实体对应一个,服务层更多的是按照功能模块的划分,比如 一个登录模块,创建一个LoginService。

为了模拟,我们这里做个简单的添加功能而已。

namespace DPMS.Service
{
/// <summary>
/// 需求模块服务接口
/// </summary>
public interface IInvestService
{
/// <summary>
/// 添加需求
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
string AddInvest(Invest model);
/// <summary>
/// 获取配置信息
/// </summary>
/// <returns></returns>
string GetName(); }
}
namespace DPMS.Service.Impl
{
/// <summary>
/// 需求实现类
/// </summary>
public class InvestService : IInvestService
{ private readonly IInvestRepository _investRepository; //需求的仓储
private readonly IConfiguration _configuration;//全局的配置对象 /// <summary>
/// 在构造函数中注入
/// </summary>
/// <param name="investRepository"></param>
/// <param name="configuration"></param>
public InvestService(IInvestRepository investRepository, IConfiguration configuration)
{
_investRepository = investRepository;
_configuration = configuration;
}
/// <summary>
/// 添加需求
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public string AddInvest(Invest model)
{
_investRepository.Add(model); //注意这里的_investRepository为接口对象
return model.ID.ToString();
} /// <summary>
/// 获取appsettings.json中的配置信息,此例是演示如何读取配置
/// </summary>
/// <returns></returns>
public string GetName()
{
return _configuration.GetSection("AllowedHosts").Key+":"+_configuration.GetSection("AllowedHosts").Value;
}
}
}

四、Web层

demo采用Asp.net Core MVC作为示例

项目中引入我们所需要的几个程序集。即红框中的程序集。

配置我们的数据库连接:

在appsettings.json中进行配置,如下:

{
"DataBaseSetting": {
"ConnectionString": "mongodb://127.0.0.1",
"DatabaseName": "DPMS"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
DataBaseSetting名字必须是固定的,因为我们底层连接默认就是这个名字。

接下来就是做数据库连接的映射和注入,以及数据库上下文的注入
在Startup.cs 文件中,如下:

        public void ConfigureServices(IServiceCollection services)
{ services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); //读取appsettings.json文件中的MongoDbSettings节点数据,赋值给MongoDbSettings对象
services.Configure<DataBaseSetting>(
Configuration.GetSection(nameof(DataBaseSetting))); //注入MongoDbSettings对象
services.AddSingleton<IDataBaseSetting>(sp =>
sp.GetRequiredService<IOptions<DataBaseSetting>>().Value); ////注入上下文对象
services.AddScoped<DbContextBase>();
//注册程序集
services.AddKySharpService(new string[]{ "DPMS.Repository", "DPMS.Service" }); }

按照如上,完成我们的注入工作。其中 数据库配置和数据库上下文都是必须注入的。
程序集在底层实现了批量注入的逻辑,程序集的注入必须按照先后顺序进行。

下面在Web中使用,创建控制器Home,并完成在构造函数中实例化 return model.ID.ToString();

        /// <summary>
/// 定义接口类型对象
/// </summary>
private readonly IInvestService _investService;
public HomeController(IInvestService investService)
{
//完成构造函数中的实例化
this._investService = investService;
}
public string Index()
{
var model = new Invest {CD_No = "aasd"};
_investService.AddInvest(model);//调用服务层进行写入
return model.ID.ToString();
}

如上代码,实现了 实现类与接口的控制反转。

如果我们不用服务层,如何直接使用仓储层,原理是一样的,见下面代码

 /// <summary>
/// 定义接口类型对象
/// </summary>
private readonly IInvestService _investService; private readonly IInvestRepository _investRepository;
public HomeController(IInvestService investService, IInvestRepository investRepository)
{
//完成构造函数中的实例化
this._investService = investService;
_investRepository = investRepository;
}
public string Index()
{
var model = new Invest {CD_No = "aasd"};
_investRepository.Add(model);//调用服务层进行写入
return model.ID.ToString();
}

异步的方法:

 public async Task<string> Index2()
{
var model = new Invest { CD_No = "aasd" };
await _investRepository.AddAsync(model);//调用服务层进行写入
return model.ID.ToString();
}

在KYSharpCore.MongoDB中,已经完全实现了异步的操作方法。

项目源码:

链接:https://pan.baidu.com/s/1X9ZM4zWaMWSkN61v8uay_Q
提取码:1hys

ASP.NET Core+MongoDB(一)的更多相关文章

  1. Asp.Net Core MongoDB

    废话不说直接上代码: using MongoDB.Bson.Serialization.Attributes; namespace XL.Core.MongoDB { public interface ...

  2. Asp.Net Core Use MongoDB

    前几天在网上想找一下Asp.Net Core使用MongoDB相关的文章,也看了几篇,发现都是在写简单的例子,这样的例子是不能用在生产环境的,不能用的生产环境的.封装一个东西一定是建立在你对这个东西足 ...

  3. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...

  4. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...

  5. Using MongoDB with Web API and ASP.NET Core

    MongoDB is a NoSQL document-oriented database that allows you to define JSON based documents which a ...

  6. asp.net core集成MongoDB

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...

  7. 问题:调用 ASP.Net Core WebAPI的HTTP POST方法时,从 [FromBody] 中读取的 MongoDB GeoJsonObjectModel成员总是null

    问题描述: POST/PUT to ASP.Net Core with [FromBody] to a MongoDB GeoJsonObjectModel member is always null ...

  8. ASP.NET Core使用MongoDB数据库

    环境:Asp.Net Core Mvc 2.2,MongoDB 4.09 参考文档:http://mongodb.github.io/mongo-csharp-driver/ http://mongo ...

  9. ASP.NET Core 之 Identity 入门(三)

    前言 在上一篇文章中,我们学习了 CookieAuthentication 中间件,本篇的话主要看一下 Identity 本身. 最早2005年 ASP.NET 2.0 的时候开始, Web 应用程序 ...

随机推荐

  1. docker仓库资源的地址修改

    docker仓库资源的地址修改 1.新增或者修改/etc/docker目录下的daemon.json文件 样例文件如下 { "registry-mirrors": ["h ...

  2. elk 7.2

    Elasticsearch 7.0开始内置了Java环境 1.jvm.options配置建议 Xmx和Xms设置成一样 Xmx不要超过机器内存的50% 不要超过30GB https://www.ela ...

  3. Error: EACCES: permission denied, mkdir

    今天在全局安装飞冰的时候,出现标题的错误 想到是权限不够的问题,其实飞冰官网也有解决的办法,就是更改npm的默认路径.我之前就是用了更改默认路径的方法,然后后来又恢复了默认路径,所以还是用默认路径加权 ...

  4. 网络编程ssh,粘包

    1.什么是socket? TCP,可靠地,面向连接协议,有阻塞rect udp,不可靠的,无线连接的服务 这里因为不需要阻塞,所以速度会很快,但安全性不高 2.关于客户端退出而服务器未退出的解决办法 ...

  5. 每天一套题打卡|河南省第七届ACM/ICPC

    A 海岛争霸 题目:Q次询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少. 多源点最短路,用floyd 在松弛更新:g[i][k] < g[i][ ...

  6. 软件工程1916|W(福州大学)_助教博客】团队第六次作业(第9次)成绩公示

    1. 作业链接: 团队作业第六次-团队Github实战训练 2. 评分准则: 本次作业评分分为两部分,一部分是博客分数(满分100分),另一部分是工程能力分数(满分30分). 博客分数计算方式: 团队 ...

  7. MySQL数据库 存储引擎,创建表完整的语法,字段类型,约束条件

    1.存储引擎 - 存储引擎是用于根据不同的机制处理不同的数据. - 查看mysql中所有引擎: - show engines; - myisam: 5.5以前老的版本使用的存储引擎 - blackho ...

  8. Linux上用NAT实现上网

    1. 安装好Linux后,选择NAT方式 2. 在Windows主机上用ipconfig /all 查看VMnet8的IP地址,一般是192.168.X.1/255.255.255.0,如果不知道是哪 ...

  9. 论文阅读笔记六十四: Architectures for deep neural network based acoustic models defined over windowed speech waveforms(INTERSPEECH 2015)

    论文原址:https://pdfs.semanticscholar.org/eeb7/c037e6685923c76cafc0a14c5e4b00bcf475.pdf 摘要 本文研究了利用深度神经网络 ...

  10. Redis笔记2-Redis安装、配置

    下载安装包 wget http://download.redis.io/releases/redis-4.0.8.tar.gz解压 tar xzvf redis-4.0.8.tar.gz安装 cd r ...