摘要: 一. SQL开篇 1. where用法 1 #region 封装EF调用SQL语句查询 2 public static List<T> ExecuteQuery<T>(string sql, params SqlParameter[] pars) 3 { 4 return db.Database.S 阅读全文
posted @ 2017-08-10 11:57 Yaopengfei 阅读(1247) 评论(1) 推荐(0) 编辑
摘要: 一. Linq开篇 1.Where用法 linq中where的用法与SQL中where的用法基本一致。 1 #region 01-where用法 2 { 3 //1. where用法 4 //1.1 查询账号为admin的用户信息 5 Console.WriteLine(" 1. where用法 " 阅读全文
posted @ 2017-08-07 22:19 Yaopengfei 阅读(2320) 评论(3) 推荐(1) 编辑
摘要: 一. 简介 Lambda、Linq、SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用。 相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学期间都会学习SQL Server数据库,当然也会学习SQL语言了(顺便吐槽一下,学校用SQL Serve 阅读全文
posted @ 2017-08-01 16:10 Yaopengfei 阅读(3417) 评论(2) 推荐(4) 编辑
摘要: 一. 章前小结 在前一个章节中,我们通过IOC的的模式解决了发布后动态切换缓存类型问题,通过CallContext数据槽解决了单线程的实例唯一的问题,那么如果解决全局实例唯一(即多线程内实例唯一),我们很容易的想到了单例模式,提到单例模式,我们很容易想到单例模式的三种形式。 详见:单例模式 二. 构 阅读全文
posted @ 2017-08-01 15:08 Yaopengfei 阅读(1478) 评论(2) 推荐(0) 编辑
摘要: 一. 章前小节 在前面的两个章节,我们运用依赖倒置原则,分别对 System.Web.Caching.Cache和 System.Runtime.Cacheing两类缓存进行了封装,并形成了ICache接口、RuntimeCacheHelp类和MemoryCacheHelp类。到这里,相当于万里长征 阅读全文
posted @ 2017-07-28 16:00 Yaopengfei 阅读(583) 评论(0) 推荐(0) 编辑
摘要: 一. 轻车熟路 有了上一个章节对 System.Web.Caching.Cache 的探究,这里我们按照同样的思路对 MemoryCache 进行探究,相信必定会得心应手。 1. 程序集准备 a. 需要给项目添加 System.Runtime.Cacheing程序集。 b. 需要给使用的地方添加两个 阅读全文
posted @ 2017-07-28 10:13 Yaopengfei 阅读(951) 评论(0) 推荐(0) 编辑
摘要: 一. 揭开迷雾 1. 程序集准备 a. 需要给项目添加 System.Web 程序集。 b. 需要给使用的地方添加两个引用。 2. 程序集探究 在对应的类中输入关键字 Cache,选中点击F12,查看Cache程序集,如下图所示: 我们一起来分析从上往下来分析一下该程序集。 (1). 两个字段,根据 阅读全文
posted @ 2017-07-25 14:45 Yaopengfei 阅读(651) 评论(0) 推荐(0) 编辑
摘要: 一. 前言 说起缓存,业内有句话,架构师有一半以上的时间是在和缓存打交道。那么缓存到底是什么呢?又有什么作用呢?该系列将揭开缓存神秘的面纱,从零开始,由浅入深,细究各类缓存。 缓存我个人理解,是利用空间换时间最好的体现,将一些耗时操作(复杂的数据库查询、文件内容的读取)、不经常改变的数据(比如商城的 阅读全文
posted @ 2017-07-22 11:18 Yaopengfei 阅读(795) 评论(1) 推荐(0) 编辑
摘要: 一. 安装流程 1. 软件和环境 (1). 软件 : SQL Server 2008 R2 企业版 软件下载地址:https://msdn.itellyou.cn/ (2). 环境要求: .Net FrameWork 3.5 以上 (windows 7 和 windows Server 2008 及 阅读全文
posted @ 2017-07-18 16:21 Yaopengfei 阅读(2576) 评论(1) 推荐(0) 编辑
摘要: 1. 打开服务器管理器,点击【添加角色和功能选项】。 2. 进入“添加角色和功能向导”页面,点击下一步。 3. 安装类型选择【基于角色或基于功能的安装】,点击下一步。 4. 进入服务器选择页面,选择【从服务器池中选择服务器】,点击下一步。 5. 进入服务器角色界面后,找到WEB服务器(IIS),然后 阅读全文
posted @ 2017-07-18 11:28 Yaopengfei 阅读(6973) 评论(0) 推荐(0) 编辑
摘要: 一. MySQL的备份和恢复 1. 命令行导入导出SQL 通过管理员的身份cmd命令进入dos窗口。 (1). 导出命令: mysqldump -u账户 -p密码 数据库名称>脚本文件存储地址 。 eg:mysqldump -uroot -p123456 ypftest> C:/XXXX.sql ( 阅读全文
posted @ 2017-07-16 23:42 Yaopengfei 阅读(717) 评论(1) 推荐(0) 编辑
摘要: 一. 插入 1. 全字段插入 (1). 标准格式 insert into tableName (c1,c2,c3 ...) values (x1,x2,x3,...) 可以省略: insert into tableName values (x1,x2,x3,...) (2). 插入多条数据 inse 阅读全文
posted @ 2017-07-16 23:41 Yaopengfei 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 一. 综述 查询操作主要从两个方面来说:单表查询和多表查询。 多表查询包括:笛卡尔积、外键约束、内连接查询、外链接查询、自连接查询。 二 . 案例设计 1. 设计产品表(product)。包括:主键id、产品名称(productName)、分类编号(dir_id)、零售价(salePrice)、供应 阅读全文
posted @ 2017-07-16 22:26 Yaopengfei 阅读(491) 评论(0) 推荐(0) 编辑
摘要: 一. 前言 1. 简介 就查询而言,可以简单的分为:单表查询 和 多表查询。 单表查询包括:简单查询、过滤查询、结果排序、分页查询、聚集函数。 多表查询包括:笛卡尔积、外键约束、内连接查询、外链接查询、自连接查询。 2. 数据准备 (1). 用到的表: 产品表(product)。包括:主键id、产品 阅读全文
posted @ 2017-07-15 11:53 Yaopengfei 阅读(1524) 评论(3) 推荐(0) 编辑
摘要: 一. MySQL操作 1. 数据库相关操作 (1). 查看有哪些数据库: show databases; (2). 使用指定数据库: use 数据库名称; (3). 查看指定数据库中有哪些表: show tables; (4). 创建指定名称的数据库: create database 数据库名称; 阅读全文
posted @ 2017-07-15 10:00 Yaopengfei 阅读(426) 评论(1) 推荐(0) 编辑
摘要: 1. MySQL中的数据库分类 2. MySQL中的存储引擎 MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 MyI 阅读全文
posted @ 2017-07-11 20:33 Yaopengfei 阅读(432) 评论(0) 推荐(0) 编辑
摘要: 一. Linux 和 docker安装 1. Centos8.0 下安装MySQL5.7 (rpm包) 详见: https://www.cnblogs.com/yaopengfei/p/13766324.html 2. Centos Stream 9 下安装MySQL8.4 (压缩包形式) 详见:h 阅读全文
posted @ 2017-07-10 21:32 Yaopengfei 阅读(654) 评论(1) 推荐(0) 编辑
摘要: 1. 单例模式的作用 保证多个进程内,(即使多线程访问)该对象的实例只有一个,而且只会被创建一次。 2. 单例模式什么时候用? 该对象的构造函数非常耗时,实例化一次该对象,需要非常长的时间,这样如果每次都去创建,会消耗很多资源。 3. 单例模式的代价 private static Singleton 阅读全文
posted @ 2017-07-08 22:57 Yaopengfei 阅读(420) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 严格意义上的说,简单工厂不属于23中设计模式,这里抛砖引玉,引出后面的工厂方法和抽象工厂两种设计模式。 简答工厂违背:单一职责原则、开闭原则、迪米特法则。 2. 核心代码 1 /// <summary> 2 /// 简单工厂类 3 /// </summary> 4 public clas 阅读全文
posted @ 2017-07-08 21:41 Yaopengfei 阅读(435) 评论(0) 推荐(0) 编辑
摘要: 1. 背景 在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。 2. 定义 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 3. 解决方案 当软件需要变化时,尽量通过扩 阅读全文
posted @ 2017-07-04 19:42 Yaopengfei 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 1. 背景 类与类之间的关系越密切,耦合度越大,当一个类发生变化时,对另一个类的影响也越大。 2. 定义 一个类应该对其它类保持最少的了解。 3. 解决方法 尽量降低类与类之间的耦合。 4. 迪米特法则的核心 低耦合 5.迪米特法则深究 只与直接的朋友通信。 每个对象都会与其他对象有耦合关系,只要两 阅读全文
posted @ 2017-07-04 19:41 Yaopengfei 阅读(855) 评论(0) 推荐(0) 编辑
摘要: 1. 背景 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类B和类D来说不是最小接口,则类B和类D不得不去实现它们不需要的方法。 2. 定义 一个类对另一个类的依赖应该建立在最小的接口上,不应该依赖他不需要的接口。 3. 解决方案 将臃肿的接口I拆分为独立的几个接口,类A和类C分别于 阅读全文
posted @ 2017-07-04 19:40 Yaopengfei 阅读(399) 评论(0) 推荐(0) 编辑
摘要: 1. 背景 类A是高层代码,类A直接依赖B,如果要将类A改为还要依赖C,则必须修改类A的代码来实现。在实际场景中,类A是高层,负责业务逻辑,类B和类C是低层模块,负责基本的原子操作,假如修改A,会给程序带来不必要的风险。 2. 定义 高层模块不直接依赖低层模块,二者都应该依赖其抽象(抽象类或接口), 阅读全文
posted @ 2017-07-01 20:54 Yaopengfei 阅读(679) 评论(0) 推荐(0) 编辑
摘要: 1. 背景 有一个功能p1,由类A完成,现在需要将功能p1进行扩展,扩展后的功能为p3,p3由原功能p1和新功能p2组成,而新功能p3和p2均由类A的子类B来完成,子类B在完成新功能p2的同时,可能会导致原有的功能p1故障。 2. 定义 所有引用基类的地方能透明的使用其子类对象进行替代。 3. 对应 阅读全文
posted @ 2017-07-01 09:17 Yaopengfei 阅读(632) 评论(0) 推荐(0) 编辑
摘要: 1. 背景 类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。 2. 定义 不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 3. 宏观上 类层次上存在单一职责原则,同样方法层次上也存在单一职责 阅读全文
posted @ 2017-07-01 09:16 Yaopengfei 阅读(901) 评论(1) 推荐(0) 编辑
摘要: 一. 基本概念 1. 什么是特性? MSDN官方给出的定义时:公共语言运行时允许添加类似关键字的描述声明,叫做特性,它对程序中的元素进行标注,如类型、字段、方法和属性等。Attribute和Microsoft .Net Framework文件的元数据(metadata)保存在一起,可以用来向运行时描 阅读全文
posted @ 2017-06-28 08:37 Yaopengfei 阅读(1713) 评论(0) 推荐(0) 编辑
摘要: 1. 线程的异常处理 我们经常会遇到一个场景,开启了多个线程,其中一个线程报错,导致整个程序崩溃。这并不是我们想要的,我需要的结果是,其中一个线程报错,默默的记录下,其它线程正常进行,保证程序整体可以走下来。 解决方案:给函数体加try-catch,只让报错线程异常,其它线程可以正常进行。 运行结果 阅读全文
posted @ 2017-06-25 11:23 Yaopengfei 阅读(405) 评论(8) 推荐(0) 编辑
摘要: 1. 方法名前只有async,但是方法中Task实例前没有await关键字,该方法和普通方法没有什么区别,但是会报一个警告。 结果: 2. 用法:方法名前加async,如果方法无返回值,用async Task 代替async void ,await放到Task实例前面,表示执行完Task线程后,方可 阅读全文
posted @ 2017-06-23 20:02 Yaopengfei 阅读(415) 评论(0) 推荐(0) 编辑
摘要: 一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托。 2. 利用Task.Run()开启多线程,能向其中传递无参数的委托,有参数的可以使用 Task.Run(()=>{ TestTh 阅读全文
posted @ 2017-06-23 20:00 Yaopengfei 阅读(624) 评论(0) 推荐(0) 编辑
摘要: 一. Thread多线程 1. 两种使用方式 通过F12查看Thread后,发现有两类构造函数,ParameterizedThreadStart和ThreadStart,其中 ThreadStart:无参无返回值的委托 ParameterizedThreadStart:无返回值,但是有一个objec 阅读全文
posted @ 2017-06-23 19:59 Yaopengfei 阅读(369) 评论(0) 推荐(0) 编辑