第2章 逻辑分页、AutoFac注入、工作单元与仓储

这篇具有很好参考价值的文章主要介绍了第2章 逻辑分页、AutoFac注入、工作单元与仓储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 CoreCms.Net.Model.ViewModels.Basics.IPageList<T>

namespace CoreCms.Net.Model.ViewModels.Basics

{

    ///<typeparam name="T">泛型类型实例(1个指定实体的类型实例)</typeparam>

    /// <summary>

    /// 【逻辑分页列表--接口】

    /// <remarks>

    /// 摘要:

    ///     通过继承该接口的具体实现类中的属性成员实例,逻辑的从数据源中加载指定1页中的数据,存储到1逻辑页中,从而尽量少的从指定表加载数据,从而尽量降低内存的消耗。

    /// 说明:

    ///     逻辑分页交互操作对象是当前程序与数据库的指定表。

    /// </remarks>

    /// </summary>

    public interface IPageList<T> : IList<T>

    {

        #region 属性

        /// <summary>

        /// 【当前页】

        /// <remarks>

        /// 摘要:

        ///     获取/设置当前页,当前逻辑(内存)页面的整型索引值,从“0”开始计算。

        /// </remarks>

        /// </summary>

        int PageIndex { get; }

        /// <summary>

        /// 【页面大小】

        /// <remarks>

        /// 摘要:

        ///     获取/设置页面大小,即1逻辑(内存)页面最多所存储的实例项的整型个数值。

        /// </remarks>

        /// </summary>

        int PageSize { get; }

        /// <summary>

        /// 【总计值】

        /// <remarks>

        /// 摘要:

        ///     获取/设置数据源实例项的整型总计值。

        /// </remarks>

        /// </summary>

        int TotalCount { get; }

        /// <summary>

        /// 【总页数】

        /// <remarks>

        /// 摘要:

        ///     获取/设置总页数,即数据源实例项,可以分为逻辑页数的总计值。

        /// </remarks>

        /// </summary>

        int TotalPages { get; }

        /// <summary>

        /// 【上1页?】

        /// <remarks>

        /// 摘要:

        ///     获取1个值false(没有)/true(),该值指示在逻辑(内存)分页操作中当前页是否有上1(1页之前没有上1)

        /// </remarks>

        /// </summary>

        bool HasPreviousPage { get; }

        /// <summary>

        /// 【下1页?】

        /// <remarks>

        /// 摘要:

        ///     获取1个值false(没有)/true(),该值指示在逻辑(内存)分页操作中当前页是否有下1(最后1页之后没有下1)

        /// </remarks>

        /// </summary>

        bool HasNextPage { get; }

        #endregion

    }

}

2 CoreCms.Net.Model.ViewModels.Basics.PageList<T>  

namespace CoreCms.Net.Model.ViewModels.Basics

{

    ///<typeparam name="T">泛型类型实例(1个指定实体的类型实例)</typeparam>

    /// <summary>

    /// 【逻辑分页列表--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类及其属性成员实例,只逻辑的从数据源中加载指定1页中的数据,存储到1(逻辑)页中,从而尽量少的从指定表加载数据,从而尽量降低内存的消耗。

    /// 说明:

    ///     (逻辑)分页交互操作对象是当前程序与数据库的指定表。

    /// [Serializable]

    ///     序列化可以对象的状态信息转换成可以持久化或者可以传输形式的过程。一般是转为字节数据。而把字节数组还原成原来同等对象的过程成为反序列化。

    ///     这里特指把逻辑分页实体中的所有数据换成可以进行网络传输的形式。

    /// </remarks>

    /// </summary>

    [Serializable]

    public class PageList<T> : List<T>, IPageList<T>

    {

        #region 拷贝构造方法

        ///<typeparam name="T">泛型类型实例(1个指定实体的类型实例)</typeparam>

        /// <param name="source">“IQueryable”实例进行存储的1个指定类型的数据源(枚举数接口实例=长串型,包含:数组、列表、字典等)</param>

        /// <param name="pageIndex">分页操作中当前页的整型索引值。</param>

        /// <param name="pageSize">1逻辑(内存)页面最多所存储的实例项的整型个数值。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     通过拷贝构造方法为该类中的属性成员赋值实例化初始值,并获取1逻辑(内存)页面内的所有数据。

        /// </remarks>

        /// </summary>

        public PageList(IQueryable<T> source, int pageIndex, int pageSize)

        {

            var total = source.Count();

            TotalCount = total;

            TotalPages = total / pageSize;

            if (total % pageSize > 0)

                TotalPages++;

            PageSize = pageSize;

            PageIndex = pageIndex;

            AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList());

        }

        /// <param name="source">以列表接口实例进行存储的1个指定类型的数据源(包含:数组、列表、字典等)</param>

        /// <param name="pageIndex">分页操作中当前页的整型索引值。</param>

        /// <param name="pageSize">1逻辑(内存)页面最多所存储的实例项的整型个数值。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     通过拷贝构造方法为该类中的属性成员赋值实例化初始值,并获取1逻辑(内存)页面内的所有数据。

        /// </remarks>

        /// </summary>

        public PageList(IList<T> source, int pageIndex, int pageSize)

        {

            TotalCount = source.Count();

            TotalPages = TotalCount / pageSize;

            if (TotalCount % pageSize > 0)

                TotalPages++;

            PageSize = pageSize;

            PageIndex = pageIndex;

            AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList());

        }

        /// <param name="source">以列表接口实例进行存储的1个指定类型的数据源(包含:数组、列表、字典等)</param>

        /// <param name="pageIndex">分页操作中当前页的整型索引值。</param>

        /// <param name="pageSize">1逻辑(内存)页面最多所存储的实例项的整型个数值。</param>

        /// <param name="totalCount">数据源实例项的整型总计值。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     通过拷贝构造方法为该类中的属性成员赋值实例化初始值,并获取1逻辑(内存)页面内的所有数据。

        /// </remarks>

        /// </summary>

        public PageList(IEnumerable<T> source, int pageIndex, int pageSize, int totalCount)

        {

            TotalCount = totalCount;

            TotalPages = TotalCount / pageSize;

            if (TotalCount % pageSize > 0)

                TotalPages++;

            PageSize = pageSize;

            PageIndex = pageIndex;

            AddRange(source);

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【当前页】

        /// <remarks>

        /// 摘要:

        ///     获取/设置当前页,当前逻辑(内存)页面的整型索引值,从“0”开始计算。

        /// </remarks>

        /// </summary>

        public int PageIndex { get; }

        /// <summary>

        /// 【页面大小】

        /// <remarks>

        /// 摘要:

        ///     获取/设置页面大小,即1逻辑(内存)页面最多所存储的实例项的整型个数值。

        /// </remarks>

        /// </summary>

        public int PageSize { get; private set; }

        /// <summary>

        /// 【总计值】

        /// <remarks>

        /// 摘要:

        ///     获取/设置数据源实例项的整型总计值。

        /// </remarks>

        /// </summary>

        public int TotalCount { get; }

        /// <summary>

        /// 【总页数】

        /// <remarks>

        /// 摘要:

        ///     获取/设置总页数,即数据源实例项,可以分为逻辑页数的总计值。

        /// </remarks>

        /// </summary>

        public int TotalPages { get; }

        /// <summary>

        /// 【上1页?】

        /// <remarks>

        /// 摘要:

        ///     获取1个值false(没有)/true(),该值指示在逻辑(内存)分页操作中当前页是否有上1(1页之前没有上1)

        /// </remarks>

        /// </summary>

        public bool HasPreviousPage => PageIndex > 0;

        /// <summary>

        /// 【下1页?】

        /// <remarks>

        /// 摘要:

        ///     获取1个值false(没有)/true(),该值指示在逻辑(内存)分页操作中当前页是否有下1(最后1页之后没有下1)

        /// </remarks>

        /// </summary>

        public bool HasNextPage => PageIndex + 1 < TotalPages;

        #endregion

    }

}

3 CoreCms.Net.Core.AutoFac.AutofacModuleRegister  

using Autofac;

using System.Reflection;

namespace CoreCms.Net.Core.AutoFac

{

    /// <summary>

    /// Autofac模型注入--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的方法成员把指定的程序集(*.dll)依赖注入到Autofac容器中。

    /// </remarks>

    /// </summary>

    public class AutofacModuleRegister : Autofac.Module

    {

        /// <param name="builder">Autofac依赖注入容器实例。</param>

        /// <summary>

        /// 【载入】

        /// <remarks>

        /// 摘要:

        ///     通过该方法把指定程序集中的所有实例依赖注入到Autofac容器中。

        /// </remarks>

        /// </summary>

        protected override void Load(ContainerBuilder builder)

        {

            //获取当前程序启动项程序集(*.dll)文件所在目录(文件夹)的绝对路径字符串(这里特指“..\bin\Debug\net7.0”)

            var basePath = AppContext.BaseDirectory;

            #region 带有接口层的服务注入

            //var servicesDllFile = Path.Combine(basePath, "CoreCms.Net.Services.dll");

            var repositoryDllFile = Path.Combine(basePath, "CoreCms.Net.Repository.dll");

            /*  if (!(File.Exists(servicesDllFile) && File.Exists(repositoryDllFile)))

            {

                var msg = "Repository.dllServices.dll 丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。";

                throw new Exception(msg);

            }*/

         

            // 获取 Service.dll 程序集服务,并注册

            /*var assemblysServices = Assembly.LoadFrom(servicesDllFile);

            //支持属性注入依赖重复

            builder.RegisterAssemblyTypes(assemblysServices).AsImplementedInterfaces().InstancePerDependency()

                .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

*/

            // 获取 Repository.dll 程序集服务,并注册

            var assemblysRepository = Assembly.LoadFrom(repositoryDllFile);

            //支持属性注入依赖重复

            builder.RegisterAssemblyTypes(assemblysRepository).AsImplementedInterfaces().InstancePerDependency()

                .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);

            #endregion

        }

    }

}

4 Program.cs

#region AutoFac注册============================================================================

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>

{

    //获取所有控制器类型并使用属性注入

    var controllerBaseType = typeof(ControllerBase);

    containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly)

        .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)

        .PropertiesAutowired();

    containerBuilder.RegisterModule(new AutofacModuleRegister());

});

#endregion

5 CoreCms.Net.IRepository.UnitOfWork.IUnitOfWork

using SqlSugar;

namespace CoreCms.Net.IRepository.UnitOfWork

{

    /// <summary>

    /// 【工作单元--类】

    /// <remarks>

    /// 摘要:

    ///     通过继承该接口的具体实现类中的方法成员,获取SqlSugarScope(用单例AddSingleton 单例)上下文中间件实例,从而为实现实体与表的CURD操作提供支撑。

    /// </remarks>

    /// </summary>

    public interface IUnitOfWork

    {

        #region 方法

        /// <summary>

        /// 【获取数据库数据端】

        /// <remarks>

        /// 摘要:

        ///     获取SqlSugarScope(用单例AddSingleton  单例)上下文中间件实例,该实例为通过 SqlSugar中间件实现实体与表的CURD操作提供支撑。

        /// </remarks>

        /// </summary>

        SqlSugarScope GetDbClient();

        /// <summary>

        /// 【事务开始】

        /// <remarks>

        /// 摘要:

        ///    该方法通过事务操作实现实现实体与表的CURD操作提供支撑,该方法主要指开启1个事务。

        /// </remarks>

        /// </summary>

        void BeginTran();

        /// <summary>

        /// 【事务提交】

        /// <remarks>

        /// 摘要:

        ///    该方法通过事务操作实现实现实体与表的CURD操作提供支撑,该方法主要指把1个事务中的所有操作进行提交到指定的数据库中。

        /// </remarks>

        /// </summary>

        void CommitTran();

        /// <summary>

        /// 【事务回滚】

        /// <remarks>

        /// 摘要:

        ///    该方法通过事务操作实现实现实体与表的CURD操作提供支撑,当把1个事务中的所有操作进行提交到指定的数据库的过程中如果出现异常时,则通过该方法实现回滚。

        /// </remarks>

        /// </summary>

        void RollbackTran();

        #endregion

    }

}

6 CoreCms.Net.IRepository.UnitOfWork.UnitOfWork

using CoreCms.Net.IRepository.UnitOfWork;

//using CoreCms.Net.Loging;

//using NLog;

using SqlSugar;

using SqlSugar.IOC;

namespace CoreCms.Net.Repository.UnitOfWork

{

    /// <summary>

    /// 【工作单元--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的成员获取SqlSugarScope(用单例AddSingleton  单例)上下文中间件实例,从而为实现实体与表的CURD操作提供支撑。

    /// </remarks>

    /// </summary>

    public class UnitOfWork : IUnitOfWork

    {

        #region 拷贝构造方法与变量

        /// <summary>

        /// 【上下文中间件实例】

        /// <remarks>

        /// 摘要:

        ///    ISqlSugarClient( AddScoped  每次请求一个实例)上下文中间件实例,该实例为通过 SqlSugar中间件实现实体与表的CURD操作提供支撑。

        /// </remarks>

        /// </summary>

        private readonly ISqlSugarClient _sqlSugarClient;

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     通过该拷贝构造方法,对当前类中变量成员进行实例化。

        /// </remarks>

        /// </summary>

        public UnitOfWork()

        {

            _sqlSugarClient = DbScoped.SugarScope;

        }

        #endregion

        #region 方法

        /// <summary>

        /// 【获取数据库数据端】

        /// <remarks>

        /// 摘要:

        ///     获取SqlSugarScope(用单例AddSingleton  单例)上下文中间件实例,该实例为通过 SqlSugar中间件实现实体与表的CURD操作提供支撑。

        /// </remarks>

        /// </summary>

        public SqlSugarScope GetDbClient()

        {

            // 必须要as,后边会用到切换数据库操作

            return _sqlSugarClient as SqlSugarScope;

        }

        /// <summary>

        /// 【事务开始】

        /// <remarks>

        /// 摘要:

        ///    该方法通过事务操作实现实现实体与表的CURD操作提供支撑,该方法主要指开启1个事务。

        /// </remarks>

        /// </summary>

        public void BeginTran()

        {

            GetDbClient().BeginTran();

        }

        /// <summary>

        /// 【事务提交】

        /// <remarks>

        /// 摘要:

        ///    该方法通过事务操作实现实现实体与表的CURD操作提供支撑,该方法主要指把1个事务中的所有操作进行提交到指定的数据库中。

        /// </remarks>

        /// </summary>

        public void CommitTran()

        {

            try

            {

                GetDbClient().CommitTran();

            }

            catch (Exception ex)

            {

                GetDbClient().RollbackTran();

               // NLogUtil.WriteFileLog(LogLevel.Error, LogType.Web, "事务提交异常", "事务提交异常", new Exception("事务提交异常", ex));

                throw;

            }

        }

        /// <summary>

        /// 【事务回滚】

        /// <remarks>

        /// 摘要:

        ///    该方法通过事务操作实现实现实体与表的CURD操作提供支撑,当把1个事务中的所有操作进行提交到指定的数据库的过程中如果出现异常时,则通过该方法实现回滚。

        /// </remarks>

        /// </summary>

        public void RollbackTran()

        {

            GetDbClient().RollbackTran();

        }

        #endregion

    }

}

12 CoreCms.Net.Web.Admin.Controllers.SysRoleController

using Microsoft.AspNetCore.Mvc;

using System.ComponentModel;

using CoreCms.Net.IRepository;

namespace CoreCms.Net.Web.Admin.Controllers

{

    [ApiController]

    [Route("[controller]/[action]")]

    public class SysRoleController : ControllerBase

    {

        private readonly ISysRoleRepository _dal;

        public SysRoleController(ISysRoleRepository dal)

        {

            _dal = dal;

        }

        #region 获取列表============================================================

        [HttpPost]

        [Description("获取列表")]

        public async Task</*AdminUiCallBack*/ bool> GetPageList()

        {

            var v = await _dal.QueryPageAsync(null,"");

            return true;

        }

        #endregion

    }

}

第2章 逻辑分页、AutoFac注入、工作单元与仓储,CoreShop230628一步一步前后端开发实现,.Net7,SqlSugar,AutoFac注入

对以上功能更为具体实现和注释见:230727_002CoreShop230628(逻辑分页、AutoFac注入、工作单元与仓储)。

 文章来源地址https://www.toymoban.com/news/detail-611532.html

到了这里,关于第2章 逻辑分页、AutoFac注入、工作单元与仓储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .Net6 使用Autofac进行依赖注入

    刚接触.net 6,记录一下在.net6上是怎么使用Autofac进行动态的依赖注入的 1、新建一个webapi项目,框架选择net 6 2、引用Nuget包---Autofac.Extensions.Dependency 3、在Program.cs上添加如下代码 4. 或 以及再startup.cs中添加ConfigureContainer方法    public void ConfigureContainer(ContainerBuilder builder)    

    2024年04月11日
    浏览(49)
  • .Net Framework使用Autofac实现依赖注入

    最近也是找了快2周的工作了,收到的面试邀请也就几个,然后有个面试题目是用asp.net mvc + Entityframework 做一个学生信息增删改查系统。因为题目要求了用Entityframework 也就是EF 那也就不上core了,web项目也是用Framework 4.8去做的。 本文的重点是IOC容器,在Framework 中是没有自带的

    2024年02月09日
    浏览(46)
  • .net中优秀依赖注入框架Autofac看一篇就够了

      Autofac 是一个功能丰富的 .NET 依赖注入容器,用于管理对象的生命周期、解决依赖关系以及进行属性注入。本文将详细讲解 Autofac 的使用方法,包括多种不同的注册方式,属性注入,以及如何使用多个  ContainerBuilder 来注册和合并组件。我们将提供详细的源代码示例来说明

    2024年02月05日
    浏览(48)
  • .Net6 Web Core API 配置 Autofac 封装 --- 依赖注入

    目录 一、NuGet 包导入 二、Autofac 封装类 三、Autofac 使用 四、案例测试 下列封装 采取 程序集注入方法 , 单个依赖注入, 也适用, 可依赖注入的地方配置 Autofac Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy    

    2024年02月14日
    浏览(54)
  • Autofac中多个类继承同一个接口,如何注入?与抽象工厂模式相结合

    需求: 原来是抽象工厂模式,多个类继承同一个接口。 现在需要使用Autofac进行选择性注入。 Autofac默认常识: Autofac中多个类继承同一个接口,默认是最后一个接口注入的类。 解决方案:(约定大于配置) :①工厂名默认4位字符 ② 命名Service的时候以工厂名开头 ③Autofac注入的时候先

    2024年02月10日
    浏览(61)
  • 算术逻辑单元ALU

    ALU:arithmetic and logic unit。是能实现多组算术运算和逻辑运算的组合逻辑电路。 算术逻辑单元简称“ALU”,ALU是计算机的数学大脑,也是现代计算机的基石。 ALU就是*计算机里负责运算的组件,基本其他所有部件都用到了它。 第一个封装在单个芯片内的完整ALU:英特尔74181,在

    2023年04月23日
    浏览(44)
  • MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式

    目录 引言 一、使用正确的方式实现分页 1.1.什么是分页 1.2.MyBatis中的分页实现方式 1.3.避免SQL注入的技巧 二、特殊字符的正确使用方式 2.1.什么是特殊字符 2.2.特殊字符在SQL查询中的作用 2.3.如何避免特殊字符引起的问题 2.3.1.使用CDATA区段  2.3.2.使用实体引用 三、总结和展望

    2024年02月11日
    浏览(40)
  • 硬布线控制器组合逻辑单元

    硬布线控制器组合逻辑单元 实验目的 帮助学生理解传统三级时序系统中硬布线控制器的设计原理,学生能设计硬布线控制器组合逻辑单元。 实验内容 在实现了指令译码逻辑、时序发生器主要功能部件后,进一步设计实现控制器核心模块硬布线控制器组合逻辑单元,控制器框

    2024年02月09日
    浏览(53)
  • FPGA之逻辑单元(Logic Cells)

    FPGA中的逻辑单元(Logic Cells)是一种基本的可编程逻辑资源,它们用于实现数字电路的逻辑功能。每个逻辑单元通常包含一组查找表(Look-Up Tables,LUTs)、触发器和可编程连接,使其能够执行广泛的逻辑操作。以下是关于FPGA逻辑单元的一些关键信息: 查找表(LUTs): 逻辑单

    2024年04月16日
    浏览(32)
  • @Test单元测试注入bean 3种方式

    @ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {CachingConfig.class}) 如下:     @Resource     private CacheManager cacheManager; 是CachingConfig的bean 在类上添加以下代码: 在执行test之前会先执行启动项目,后对象会

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包