ASP.NET Core+MongoDB(一)

项目类库:.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; } = 0;

        /// <summary>
        /// 产品经理确认的状态
        /// </summary>
        public int Pro_Status { get; set; } = 0;

        /// <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

原文地址:https://www.cnblogs.com/fei686868/p/11077997.html