zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    如何使用反射技术获取泛型类的真实类型?
    applicationContext.xml文件如何调用外部properties等配置文件
    applicationContext.xml中的使用${}是代表什么意思?
    net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案
    MySql中LongText字段对应Hibernate映射文件的设置(转)
    ckeditor的详细配置(转)
    XML-学习
    WSDL-学习总结
    ONVIF-WSDL
    sourceinsight相关配置
  • 原文地址:https://www.cnblogs.com/fei686868/p/11077997.html
Copyright © 2011-2022 走看看