代码编织梦想

    从本章开始进入“Blog.Core-master”示例程序内部,但是也逐渐发现该程序是1个示例性远远大于工程性的程序,其内部有着些不必要的定义,同时在定义的规范上也存在着大小的许多问题,例如:一致性的命名方式规范,大量的不必要切重复的代码,不知从那儿复用的设计定义精巧但实用性和可读性都极差的类等,所以“Blog.Core-master”程序只能作为功能性研究的示例程序,其实从该程序的实体类的定义就很能体现示例程序的特性,但不能确定,随着不断的深入该程序的示例性特性不断被新的定义所证实。该程序不能作为开发时参考的工程性项目,如果没能一定的鉴别能力本人不建设对该示例程序进行学习。   

1 “Blog.Core-master”示例程序的缺陷

       1、当前程序通过工作单元模式与仓储模式结合的方式通过“SqlSugar”中间件实现了当前程序与数据库表的CURD交互操作,但在当前实际的工程实现上工作单元模式已经逐渐的式微,而被广泛使用的是对泛型仓储的继承来实现“SqlSugar”中间件实现了当前程序与数据库表的CURD交互操作。

       2、重复定义了泛型仓储的类及其接口和泛型服务类及其接口,造成了大量的且不必须的重复代码,如果直接使用具体服务类调用泛型仓储的类及其接口就可以解决这个问题。

       3、泛型仓储的类和泛型服务类有大量的事代码,例如分页实现中有:

    /// <param name="whereExpression">查询条件“lambda”表达式实例,只有符合该表达式实例的条件,实例才能被存储到列表实例中(“Where”操作,把表中有数据的字段都赋值给相应实例的属性成员)。</param>

        /// <param name="pageIndex">当前页面的整型值,默认值:1,即第1逻辑页面。</param>

        /// <param name="pageSize">每1页中最多包含行数的整型值,默认值:20, 即每1逻辑页面内最多包含20行数据。</param>

        /// <param name="orderByFields">排序条件字符串,默认值:null,即按照表所给的默认排序规则。</param>

        /// <summary>

        /// 【分页查询】

        /// <remarks>

        /// 摘要:

        ///    从指定表中获取指定实体的符合条件的排序后的指定1逻辑页面内的所有实例,并最终这些实体的实例存储到页模型(PageModel)实例中(“Where”操作,把表中有数据的字段都赋值给相应实例的属性成员)。

        ///  注意:

        ///     当前类中只用该分页方法经过原开发者测试,其它的方法开发者都未测试。本人认为作为1个示例性为主的项目,开发者应该简化实现,而不是无用的实现堆砌到程序中。

        /// <returns>

        /// 返回:

        ///      页模型(PageModel)实例,该实例存储着指定实体的符合条件的排序后的指定1逻辑页面内的所有实例(“Where”操作,把表中有数据的字段都赋值给相应实例的属性成员)。

        /// </returns>

        /// </summary>

        public async Task<PageModel<TEntity>> QueryPage(Expression<Func<TEntity, bool>> whereExpression, int pageIndex = 1, int pageSize = 20, string orderByFields = null)

方法是经过开发者测试且被使用的,其他的都是为功能扩展预留的堆砌,但作为示例性程序中开发者应该简化实现,而不是无用的实现堆砌到程序中,即使在工程性程序中为功能扩展预留的堆砌也极少,最好的解决方案是在下1个版本中再集成相应的功能,而不是扩展预留。

    4、泛型仓储的类和泛型服务类中的所有CURD方法都是异步实现,所有的方法名后都要加上“Async”后缀字符串,以显式的方式来向其它开发者说明这些方法是异步方法。

       5、不知“DynamicLinqFactory.cs”文件中的定义是开发从哪儿复用过来的,该文件中对Link的扩展实现十分的精巧,会为CURD的定义实现提供一定的简洁性,但是相对于它的实用性不强,扩展定义实现极其复杂且不必要,使整个扩展定义显得实现逻辑混乱,可读性极差,显得及其糟糕,这是我见过的最差的扩展实现。

009 PaginationModel、PageModel<T>、MethodInfoExtensions、LinqHelper、LinkSymbol、OperationSymbol、DynamicLinqHelper、DynamicLinqFactory、QueryableExtensions

PaginationModel:该实体类及其属性成员,所存储的实例为逻辑分页操作提供数据支撑。

PageModel<T>:该类用于存储,通过该类及其成员,把1指定逻辑页面内的指定实体/模型的所有实例存储到该逻辑分页类的实例中。

MethodInfoExtensions:通过该类中的方法成员,获取1个指定方法的全名字符串。

LinqHelper:通过该类中的成员方法,为指定类的1个指定实例的Linq操作,拼接出1个“真(x => true)”“lambda”表达式实例;或拼接出1个“假(x => false)”“lambda”表达式实例。

LinkSymbol:该枚举为指定类的1个指定实例的Linq操作的“lambda”表达式实例实例拼接可能包含的3种枚实例的逻辑运算符,它们分别是:AndAlso(&&;&)/OrElse(||;|)/Empty/Oracle/(将来可能会包含 括号)。

OperationSymbol:该枚举为指定类的1个指定实例的Linq操作的“lambda”表达式实例拼接中可能包含的8种枚举实例操作和运算符,它们分别是: In(In后面跟着的是数据源)/Contains(包含,“like/contains”)/GreaterThan(大于,“>”)/GreaterThanOrEqual(大于等于,“>=”)/LessThan(小于,“<”)/ LessThanOrEqual(小于等于,“<=”)/Equal(等于,“==/=”)/NotEqual(不等于,“!=”)。

DynamicLinqHelper:通过该类中的属性成员,为指定类的1个指定实例的Linq操作,动态拼接“lambda”表达式实例的拼接提供数据支撑。

DynamicLinqFactory:通过该类中的成员方法,为指定类的1个指定实例的Linq操作,拼接出1个“lambda”表达式实例。

QueryableExtensions:通过该类中的成员方法,定义指定类的1个指定实例的Queryable扩展操作实现。

注意:

LinkSymbol、OperationSymbol、DynamicLinqHelper、DynamicLinqFactory和QueryableExtensions都定义在“DynamicLinqFactory.cs”文件中。

010 UnitOfWork、IUnitOfWorkManage、UnitOfWorkManage、

IBaseRepository<TEntity>、BaseRepository<TEntity> 、

IBaseServices<TEntity>、BaseServices<TEntity>

UnitOfWork:该类用于存储,该类及其成员,用于在工作单元模式下,为当前程序通过“SqlSugar”中间件与(多数据库软件中的)数据库的交互操作提供数据和方法支撑。

IUnitOfWorkManage接口:继承该接口的具体实现类中的方法成员,用于在工作单元模式下,实现当前程序通过“SqlSugar”中间件与(多数据库软件中的)数据库的交互操作。

UnitOfWorkManage:继承了IUnitOfWorkManage接口,该类中的方法成员,用于在工作单元模式下,实现当前程序通过“SqlSugar”中间件与(多数据库软件中的)数据库的交互操作。

IBaseRepository<TEntity>接口:继承于该是接口的具体实现类中的泛型方法成员,用于在仓储模式下,以异步方式实现了当前程序通过“SqlSugar”中间件与(多数据库软件中的)数据库的CURD交互操作。

BaseRepository<TEntity>:继承了IBaseRepository<TEntity>,该类中的泛型方法成员,用于在仓储模式下,以异步方式实现了当前程序通过“SqlSugar”中间件与(多数据库软件中的)数据库的CURD交互操作。

IBaseServices<TEntity>接口:继承于该是接口的具体实现类中的泛型方法成员,以异步方式实现了当前程序通过“SqlSugar”中间件与(多数据库软件中的)数据库的CURD交互操作。

注意:

该接口实际上只为了定义实现服务对“基础仓储接口”定义的重复实现,不必要且造成大量的重复代码。

BaseServices<TEntity>接口:继承了IBaseServices<TEntity>接口,继承于该是接口的具体实现类中的泛型方法成员,以异步方式实现了当前程序通过“SqlSugar”中间件与(多数据库软件中的)数据库的CURD交互操作。

注意:

该类实际上只为了定义实现服务对“基础仓储类”定义的重复实现,不必要且造成大量的重复代码。

对以上功能更为具体实现和注释见:221124_05Blog(泛型服务的定义实现)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhoujian_911/article/details/128023777

c++primer第五版 第10章 泛型算法(练习解答)-爱代码爱编程

进入这一章的学习,真正领略到库的强大,在头文件algorithm中,定义了丰富的算法,何为泛型,以前对泛型这个词不太了解,一直以为泛型编程很恐怖,实际接触了这一章,才开始有点点明白泛型的意味,当然在这边不展开解释,只可意会,

第五章:泛型_始于初见i的博客-爱代码爱编程

1、什么是泛型? 自从C#2.0开始支持泛型。 1. 作用: - 可以创建独立于被包含类型类和方法。 - 不必给不同的类型编写功能相同的方法或类,只需要传入一个通用数据类型,就可以合并代码。 - 可以定义类型

疯狂java讲义笔记-第9章泛型_krabi的博客-爱代码爱编程

第9章 泛型 9.1 泛型入门 9.1.1 编译时不检查类型的异常 List list = new ArrayList(); list.add("abc"); list.add(3); for(int i = 0; i

第八章 泛型与枚举_李一恩的博客-爱代码爱编程

文章目录 1、泛型1.1 泛型介绍1.2 泛型优点1.3 泛型规则1.4 泛型的使用(1)泛型类(2)泛型方法(3)泛型接口 1.5 通配符(1)通配符概述(2)通配符特点(3)子类型(带下界)通配符 exte

第八章 泛型_李一恩的博客-爱代码爱编程

文章目录 语法糖什么是泛型?能解决什么问题?说一下Java泛型工作机制?什么是类型擦除?泛型的使用什么是泛型中的限定通配符和非限定通配符? 语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由

泛型的定义及使用-爱代码爱编程

一、泛型的概念 泛型是程序语言设计的一种特性,jdk1.5定义了泛型,即参数化类型,就是把类型当做参数一样传递,类似于方法中的变量参数,然后在使用时传入具体的类型。 二、泛型类的实现与使用 public class<T>{}//自定义泛型类 public interface<T>){}//自定义泛型接口 public <T

第十二章 泛型-爱代码爱编程

目录 一、为什么要有泛型泛型的概念有没有泛型的对比二、在集合中使用泛型三、自定义泛型结构自定义泛型结构自定义泛型结构:泛型类、泛型接口自定义泛型结构:泛型方法四、泛型在继承上的体现五、通配符的使用通配符的使用:注意点有限制的通配符练习六、泛型应用举例泛型嵌套实际案例 一、为什么要有泛型 泛型:标签举例: 中药店,每个抽屉外面贴着标签 超市购物

《第12章 泛型与容器类》-爱代码爱编程

12.1 泛型 泛型的实质就是将数据类型参数化,通过为类,接口及方法设置类型参数来定义泛型。 泛型使一个类或一个方法可在多种不同类型的对象上进行操作,使用泛型意味着编写的代码可以被很多类型不同的对象所重用,从而减少数据类型转换潜在的错误。 12.1.1 泛型的概念 泛型实际上是在定义类,接口或方法时通过为其增加“类型参数”来实现的。即泛型所操作的数据

java 定义泛型接口_泛型类和泛型接口_Java语言程-爱代码爱编程

泛型类和泛型接口_Java语言程 6.7.1 泛型类和泛型接口 在Java SE5.0之前没有泛型的情况下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器不提示错误,在运行的时候才出现异常,这是一个安全隐

Java泛型的定义和使用详解-爱代码爱编程

目录 一,为什么我们需要泛型 二,什么是泛型,泛型的定义 三,如何定义和使用泛型 四、限定类型变量 五、泛型中的约束和局限性 六、泛型类型的继承规则 七、通配符类型 八、虚拟机是如何实现泛型的? 一,为什么我们需要泛型 通过分析下面两种情况,来得出我们为什么需要泛型。 1.对两个数值类型求和的情况,如下代码,当两个数值是int

《疯狂java讲义》第9章 泛型-爱代码爱编程

第9章 泛型 9.1 泛型入门 java集合有一个缺点:把一个对象“丢进”集合里,集合就会“忘记”这个对象的数据类型,变成了Object类型。(及核对元素类型没有任何限制,取出时通常要强制类型转换) 9.1.1 编译时不检查类型的异常 9.1.2 使用泛型 java的参数化类型被称为泛型(Generic)。//创建一个只想保存字符串的List集合

第12章 泛型-爱代码爱编程

目录 一、为什么要有泛型 二、在集合中使用泛型 三、自定义泛型结构 四、泛型在继承上的体现 五、通配符的使用 六、泛型应用的举例 一、为什么要有泛型 二、在集合中使用泛型 泛型的使用   1.jdk 5.0新增的特性     2.在集合中使用泛型:    总结:    ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构。

JavaEE基础第12章泛型-爱代码爱编程

第12章泛型 泛型概述 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。 泛型的使用 1.jdk5.0新增的特性 2.在集合中使用泛型: 总结:①集合接口或集合类在

第九章 泛型-爱代码爱编程

本章要点 编译时类型检查的重要性使用泛型实现编译时进行类型检查定义泛型接口、泛型类派生泛型接口、泛型类的子类、实现类使用类型通配符设定类型通配符的上限设置类型通配符的下限设定泛型形参的上限在方法签名中定义泛型泛型方法和类型通配符的区别与联系泛型方法与方法重载类型推断擦除与转换泛型与数组 本章知识可以与前一章的内容补充阅读,因为Java5增加泛型支持在很大

第十四章 泛型_不睡觉的程序猿的博客-爱代码爱编程

泛型不只是 Java 语言所特有的特性,泛型是很多编程语言的一种特性。它允许开发人员在编写代码时定义一些可变部分(数据的数据类型),这部分可变的内容在使用时才做出明确指定(指定具体的数据类型)。我们可以这样理解泛型,它的本质是对数据的操作进行封装,而忽略数据因类型造成的差异化。例如,我们定义一个方法,要对两个数据进行加法操作,由于数据类型的不同,我们需要定

golang channel 实战技巧和说明_allen.wu的博客-爱代码爱编程

文章目录 Golang Channel 实战技巧和说明Channel 的一些实战说明关于 close Channelclose Channel 的一些说明v, ok := <-ch 判断是否 close优雅判断

计算机毕业设计springboot基于springboot的窈窕之求食单平台的设计与实现9u8k6源码+系统+程序+lw文档+部署_兮兮科技的博客-爱代码爱编程

计算机毕业设计springboot基于SpringBoot的窈窕之求食单平台的设计与实现9u8k6源码+系统+程序+lw文档+部署 计算机毕业设计springboot基于SpringBoot的窈窕之求食单平台的设计与实现9u8k6源码+系统+程序+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:i

疯狂java讲义第九章泛型课后习题-爱代码爱编程

练习书上的例子并说明他们的含义 补充习题 1、为什么用List li = new ArrayList<>(); 而不用ArrayList li = new ArrayList<>(); 2、将泛型