zoukankan      html  css  js  c++  java
  • .Net Core3.0 WebApi 项目框架搭建 五:仓储模式

    .Net Core3.0 WebApi 项目框架搭建:目录

    理论介绍

    仓储(Respository)是存在于工作单元和数据库之间单独分离出来的一层,是对数据访问的封装。其优点:

    1)业务层不需要知道它的具体实现,达到了分离关注点。

    2)提高了对数据库访问的维护,对于仓储的改变并不会改变业务的逻辑,数据库可以用Sql Server(该系列博客使用)、MySql等。

    基本项目架构

    Common

     公共组件层,存放一些公共的方法

    Model

    实体Model数据层,Enity文件夹中,存放的是整个项目的数据库表实体类,可以手动创建,当然也可以自动创建后面讲Sqlsugar会讲到。

    VeiwModels文件夹,是存放的DTO实体类,在开发中,一般接口需要接收数据,返回数据,如果直接使用实体类返回的话弊端很大,不仅把重要信息暴露出去(比如手机号等),还对数据造成冗余(比如我需要接收用户的生日,还需要具体的年、月、日这就是三个字段,当然您也可以手动拆开,这只是一个栗子,所以不能直接用数据库实体类接收),就用到了DTO类的转换

    最后的是MessageModel、TableModel和PageModel.,因为在前端接口中,需要固定的格式,以及操作,不能把数据直接发出去。

    namespace Webapi.Core.Model
    {
        /// <summary>
        /// 通用返回信息类
        /// </summary>
        public class MessageModel<T>
        {
            /// <summary>
            /// 状态码
            /// </summary>
            public int status { get; set; } = 200;
            /// <summary>
            /// 操作是否成功
            /// </summary>
            public bool success { get; set; } = false;
            /// <summary>
            /// 返回信息
            /// </summary>
            public string msg { get; set; } = "服务器异常";
            /// <summary>
            /// 返回数据集合
            /// </summary>
            public T response { get; set; }
        }
    }
    MessageModel
    using System.Collections.Generic;
    
    namespace Webapi.Core.Model
    {
        /// <summary>
        /// 通用分页信息类
        /// </summary>
        public class PageModel<T>
        {
            /// <summary>
            /// 当前页标
            /// </summary>
            public int page { get; set; } = 1;
            /// <summary>
            /// 总页数
            /// </summary>
            public int pageCount { get; set; } = 6;
            /// <summary>
            /// 数据总数
            /// </summary>
            public int dataCount { get; set; } = 0;
            /// <summary>
            /// 每页大小
            /// </summary>
            public int PageSize { set; get; }
            /// <summary>
            /// 返回数据
            /// </summary>
            public List<T> data { get; set; }
    
        }
    }
    PageModel
    using System.Collections.Generic;
    
    namespace Webapi.Core.Model
    {
        /// <summary>
        /// 表格数据,支持分页
        /// </summary>
        public class TableModel<T>
        {
            /// <summary>
            /// 返回编码
            /// </summary>
            public int Code { get; set; }
            /// <summary>
            /// 返回信息
            /// </summary>
            public string Msg { get; set; }
            /// <summary>
            /// 记录总数
            /// </summary>
            public int Count { get; set; }
            /// <summary>
            /// 返回数据集
            /// </summary>
            public List<T> Data { get; set; }
        }
    }
    TableModel

    IRepository和 Repository 

     

    仓储层:repository就是一个管理数据持久层的,它负责数据的CRUD(Create, Read, Update, Delete) service layer是业务逻辑层,它常常需要访问repository层。有网友这么说:Repository(仓储):协调领域和数据映射层,利用类似与集合的接口来访问领域对象。Repository 是一个独立的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository 是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。

    我们定义了IRepository层,提供了所有的操作接口,这里简单定义一个测试接口

        public interface ITestRepository
        {
            /// <summary>
            /// 求和
            /// </summary>
            /// <param name="i"></param>
            /// <param name="j"></param>
            /// <returns></returns>
            int Sum(int i, int j);
        }

    然后再在 TestRepository.cs 中去实现该接口,记得要添加引用。

        public class TestRepository : ITestRepository
        {
    
            public int Sum(int i, int j)
            {
                return i + j;
            }
        }

    IServices和 Service

     

    业务逻辑层,就是和我们平时使用的三层架构中的BLL层很相似。Service层只负责将Repository仓储层的数据进行调用,至于如何是与数据库交互的,它不去管,这样就可以达到一定程度上的解耦,假如以后数据库要换,比如MySql,那Service层就完全不需要修改即可。

    这里在 ITestService 中添加接口

        public interface ITestService
        {
            /// <summary>
            /// 求和
            /// </summary>
            /// <param name="i"></param>
            /// <param name="j"></param>
            /// <returns></returns>
            int Sum(int i, int j);
        }
    }

    然后再在 TestService 中去实现该接口

     public class TestServic : ITestService
        {
            ITestRepository test = new TestRepository();
            public int Sum(int i, int j)
            {
                return test.Sum(i, j);
            }
        }

    创建 Controller 接口调用

    新建一个Test控制器

     新建Sum接口

    using Microsoft.AspNetCore.Mvc;
    using Webapi.Core.IService;
    using Webapi.Core.Service;
    
    namespace Webapi.Core.Controllers
    {
    
        public class TestController : BaseController
        {
            /// <summary>
            /// 求和
            /// </summary>
            /// <param name="i"></param>
            /// <param name="j"></param>
            /// <returns></returns>
            [HttpGet]
            public int Sum(int i, int j)
            {
                ITestService testService = new TestService();
                return testService.Sum(i, j);
            }
        }
    }

    F5 运行项目,调试如下:

     本章GitHub

    https://github.com/huguodong/Webapi.Core/tree/Repository

  • 相关阅读:
    《高效休息法》IT从业者如何高效休息
    《逆向管理-先行动后思考》
    《时间管理》总结
    Java面试,面试题
    Java线程池解析
    Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解
    Docker私服搭建--Harbor
    一:优化Docker中的Spring Boot应用:单层镜像方法
    七:Spring Security 前后端分离登录,非法请求直接返回 JSON
    python selenium模块使用出错-selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
  • 原文地址:https://www.cnblogs.com/huguodong/p/12907554.html
Copyright © 2011-2022 走看看