摘要: Util UI 已经开发多年, 并在多家公司的项目使用. 不过一直以来, Util UI 存在一些缺陷, 始终未能解决. 最近几个月, Util 团队下定决心, 终于彻底解决了所有已知缺陷. Util 应用框架 UI 介绍 Util 应用框架 UI 建立在 Angular , Ng-Zorro, N 阅读全文
posted @ 2024-04-28 12:31 何镇汐 阅读(1292) 评论(6) 推荐(6) 编辑
摘要: 什么是Util应用框架? Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。 Util应用框架 7.x介绍 Util应用框架的最新版本是7.x,保持与.Net最新稳定版本同步更新。 与Util 1.x相比,最新版本代码 阅读全文
posted @ 2023-10-12 20:48 何镇汐 阅读(994) 评论(5) 推荐(12) 编辑
摘要: 本节介绍Util应用框架如何操作缓存. 概述 缓存是提升性能的关键手段之一. 除了提升性能,缓存对系统健壮性和安全性也有影响. 不同类型的系统对缓存的依赖程度不同. 对于后台管理系统,由于是给管理人员使用的,用户有限,而且操作基本都需要身份认证和授权,甚至可能部署在局域网内,一般仅对耗时操作使用缓存 阅读全文
posted @ 2023-11-21 11:30 何镇汐 阅读(466) 评论(0) 推荐(4) 编辑
摘要: 本文是Util应用框架日志记录的第四篇,介绍安装和写入 Exceptionless 日志系统的配置方法. Exceptionless 是一个日志管理系统,使用 Asp.Net Core 开发,比 Seq 的模糊搜索能力弱,使用它可能需要一些技巧. Util应用框架目前主要使用 Seq 和 Excep 阅读全文
posted @ 2023-11-12 16:22 何镇汐 阅读(309) 评论(0) 推荐(3) 编辑
摘要: 本文是Util应用框架日志记录的第三篇,介绍安装和写入 Seq 日志系统的配置方法. 安装 Seq Seq是一个日志管理系统,对结构化日志数据拥有强大的模糊搜索能力. Util应用框架目前主要使用 Seq 和 Exceptionless 管理日志. 你可以从中选择一个合适的. 本节介绍使用 Dock 阅读全文
posted @ 2023-11-12 10:14 何镇汐 阅读(325) 评论(0) 推荐(2) 编辑
摘要: 本文是Util应用框架日志记录的第二篇,介绍写入日志文件的配置方法. 概述 将日志写入文本文件,不方便查看和管理,但在开发阶段可以作为临时查看日志的手段. 日志配置 引用Nuget包 Nuget包名: Util.Logging.Serilog AddSerilog 使用 AddSerilog 扩展方 阅读全文
posted @ 2023-11-12 10:07 何镇汐 阅读(76) 评论(0) 推荐(0) 编辑
摘要: 本文介绍Util应用框架如何记录日志. 日志记录共分4篇,本文是正文,后续还有3篇分别介绍写入不同日志接收器的安装和配置方法. 概述 日志记录对于了解系统执行情况非常重要. Asp.Net Core 抽象了日志基础架构,支持使用日志提供程序进行扩展,提供控制台日志等简单实现. Serilog 是 . 阅读全文
posted @ 2023-11-11 13:36 何镇汐 阅读(400) 评论(0) 推荐(0) 编辑
摘要: 本节介绍Util应用框架如何处理系统错误. 概述 系统在运行过程中可能发生错误. 系统错误可以简单分为两类: 系统异常 系统本身出现的错误. 业务异常 不满足业务规则出现的错误. 如何处理系统异常 如果发生系统异常,大多数情况下,你除了记录异常日志外,可能无法处理它们. 一个例外是并发异常. 当发生 阅读全文
posted @ 2023-11-07 14:32 何镇汐 阅读(434) 评论(0) 推荐(3) 编辑
摘要: 本节介绍Util应用框架如何进行验证. 概述 验证是业务健壮性的基础. .Net 提供了一套称为 DataAnnotations 数据注解的方法,可以对属性进行一些基本验证,比如必填项验证,长度验证等. Util应用框架使用标准的数据注解作为基础验证,并对自定义验证进行扩展. 基础用法 引用Nuge 阅读全文
posted @ 2023-11-07 08:21 何镇汐 阅读(432) 评论(0) 推荐(2) 编辑
摘要: 本节介绍Util应用框架对AspectCore AOP的使用. 概述 有些问题需要在系统中全局处理,比如记录异常错误日志. 如果在每个出现问题的地方进行处理,不仅费力,还可能产生大量冗余代码,并打断业务逻辑的编写. 这类跨多个业务模块的非功能需求,被称为横切关注点. 我们需要把横切关注点集中管理起来 阅读全文
posted @ 2023-11-05 17:21 何镇汐 阅读(615) 评论(0) 推荐(2) 编辑
摘要: 本节介绍Util应用框架相似对象之间的转换方法. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 现代化分层架构,普遍采用了构造块DTO(数据传输对象). DTO是一种参数对象,当Web API接收到请求,请求参数被装载到DTO对象中. 我们需要把 DTO 对象转换成实体 阅读全文
posted @ 2023-11-03 13:33 何镇汐 阅读(417) 评论(0) 推荐(3) 编辑
摘要: 本节介绍Util应用框架依赖注入的使用和配置扩展. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 当你想调用某个服务的方法完成特定功能时,首先需要得到这个服务的实例. 最简单的办法是直接 new 一个服务实例,不过这样就把服务的实现牢牢绑死了,当你需要更换实现,除了直接 阅读全文
posted @ 2023-11-02 11:53 何镇汐 阅读(460) 评论(0) 推荐(0) 编辑
摘要: 本节介绍服务注册器的开发. 如果你不需要扩展Util应用框架,直接跳过. 当你把某些功能封装到自己的类库,并希望启动时自动执行初始化代码进行配置时,定义服务注册器. 服务注册器概述 服务注册器是Util项目启动时自动执行的代码块. Util应用框架的某些类库使用服务注册器进行配置,比如 Util.O 阅读全文
posted @ 2023-10-31 19:52 何镇汐 阅读(340) 评论(0) 推荐(1) 编辑
摘要: 本节介绍 Util 项目启动初始化过程. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 基础用法 查看 Util 服务配置,范例: var builder = WebApplication.CreateBuilder( args ); builder.AsBuild() .A 阅读全文
posted @ 2023-10-30 11:43 何镇汐 阅读(440) 评论(0) 推荐(2) 编辑
摘要: 本文介绍在项目中如何配置 Util 依赖服务. 文章分为多个小节,如果对设计原理不感兴趣,只需要阅读基础用法部分即可. 基础用法 Asp.Net Core 项目服务配置 调用 WebApplicationBuilder 实例的 AsBuild 方法, 并以链式调用Util服务扩展. 范例 var b 阅读全文
posted @ 2023-10-29 14:16 何镇汐 阅读(360) 评论(0) 推荐(1) 编辑
摘要: 本文将引导你运行Util权限管理模块,并对UI按钮和API操作进行访问控制. Util平台介绍 Util应用框架是一组类库,它们提供了有用的功能. 虽然Util配套代码生成器能够帮助你创建项目基架,但直接使用它们的成本依然高昂. 第一个挡在前面的障碍是权限功能,它是任何业务项目的基石. 为了减轻使用 阅读全文
posted @ 2023-10-28 15:46 何镇汐 阅读(550) 评论(2) 推荐(2) 编辑
摘要: 本文演示Util应用框架开发的项目中如何编写集成测试. 准备 完成 Web Api 快速入门,本文将在之前生成的示例项目上讲解集成测试的开发. 测试概述 自动化测试对于Util应用框架的开发非常重要,它能保证基础功能的稳定性. 对于使用 Util 开发的业务项目,自动化测试不是必须的,但掌握它可能很 阅读全文
posted @ 2023-10-26 15:51 何镇汐 阅读(488) 评论(0) 推荐(5) 编辑
摘要: 本文是Util应用框架 Angular UI 开发快速入门教程. Util前端技术概述 Util 应用框架目前仅支持用于开发管理后台的 UI. 本文介绍了 Util UI 的技术特点和功能支持. UI 技术选型 Js语言 TypeScript TypeScript 是 微软开发的脚本语言, 扩展了弱 阅读全文
posted @ 2023-10-25 20:21 何镇汐 阅读(493) 评论(0) 推荐(7) 编辑
摘要: 本文是使用Util应用框架开发 Web Api 项目快速入门教程. 前面已经详细介绍了环境搭建,如果你还未准备好,请参考前文. 开发流程概述 创建代码生成专用数据库. Util应用框架需要专门用来生成代码的数据库,该数据库仅用于代码生成. 约定: 代码生成数据库应以 .Generator 结尾. 当 阅读全文
posted @ 2023-10-19 15:32 何镇汐 阅读(626) 评论(2) 推荐(5) 编辑
摘要: 要使用Util应用框架开发项目,首先需要搭建合适的开发环境. 迈出第一步,对于很多.Net新人可能并不简单. 如果你对.Net环境并不熟悉,请尽量按照本文档进行操作. 操作系统 请安装 Windows 10 以上版本操作系统. 你也可以使用MAC操作系统,但需要自行解决开发环境问题. 安装 Visu 阅读全文
posted @ 2023-10-17 14:32 何镇汐 阅读(943) 评论(4) 推荐(10) 编辑
摘要: 前面介绍了Util是如何封装以降低Angular应用的开发成本。 现在把关注点移到服务端,本文将介绍分层架构各构造块及基类,并对不同层次的开发人员应如何进行业务开发提供一些建议。 Util分层架构介绍 为了控制业务逻辑复杂性,Util引入了DDD分层架构,这意味着如果你想使用DDD,Util会为你提 阅读全文
posted @ 2019-02-27 08:11 何镇汐 阅读(9033) 评论(31) 推荐(39) 编辑
摘要: 上篇简要介绍了Util在Angular Ts方面的封装情况,本文介绍Angular封装的另一个部分,即Html的封装。 标准组件与业务组件 对于管理后台这样的表单系统,你通常会使用Angular Material或Ng-Zorro这样的UI组件库,它们提供了标准化的UI组件。 标准组件将Ts封装起来 阅读全文
posted @ 2018-10-12 16:26 何镇汐 阅读(4596) 评论(11) 推荐(30) 编辑
摘要: 上篇介绍了Util Angular Demo的目录结构和运行机制,本文介绍Util封装Angular的基本手法及背后的动机。 Angular应用由Ts和Html两部分构成,本文介绍第一部分。 Angular Ts的封装 Ts是Angular的代码部分,用于编写页面逻辑。 依赖注入( Dependen 阅读全文
posted @ 2018-09-28 14:40 何镇汐 阅读(6867) 评论(16) 推荐(45) 编辑
摘要: 上篇介绍了Util的开发环境,并让你把Demo运行起来。本文将介绍该Demo的前端Angular运行机制以及目录结构。 目录结构 在VS上打开Util Demo,会看见如下的目录结构。 现代前端通常采用VS Code开发,不过我们为了使用TagHelper,需要采用VS开发,这为你提供了更多的选择。 阅读全文
posted @ 2018-09-17 14:49 何镇汐 阅读(8534) 评论(21) 推荐(48) 编辑
摘要: Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util的代码放进你的框架,放心使用。 Util的命名 Util这个名字看上去不怎么高大上,很多人劝我换个霸 阅读全文
posted @ 2018-09-07 13:29 何镇汐 阅读(10406) 评论(35) 推荐(75) 编辑
摘要: 距离上次发文,已经过去了三年半,这几年技术更新节奏异常迅猛,.Net进入了跨平台时代,前端也被革命性的颠覆。 回顾 2015年,正当我还沉迷于JQuery + EasyUi的封装时,突然意识到技术已经过时。 JQuery在面对更加复杂的UI需求时显得力不从心,EasyUi虽然组件比较完善,但界面风格 阅读全文
posted @ 2018-09-04 14:06 何镇汐 阅读(14577) 评论(60) 推荐(112) 编辑
摘要: 进行项目开发的第一步,是创建出适合自己团队习惯的VS解决方案,虽然我已经提供了项目示例,但毕竟是我创建的,你直接使用可能并不合适,另外你如果尝试模仿重新创建该示例,中间可能碰到各种障碍,特别是项目间的依赖关系。 本文的目的是帮助.Net架构初学者能顺利搭建起适合自己的VS解决方案,我会在本文演... 阅读全文
posted @ 2015-05-26 01:45 何镇汐 阅读(12044) 评论(72) 推荐(162) 编辑
摘要: 离上一篇又过去了一个月,时间比较紧,后续估计会更紧,所以这次将放出更多公共操作类及配套的CodeSmith模板,本篇将简要介绍新放出的重要功能,供有兴趣的同学参考。重要更新 这一次对两个VS解决方案均做了大量调整,包含项目结构及命名空间。 Util解决方案的目录截图如下。 除了少数需要配置... 阅读全文
posted @ 2015-05-20 23:09 何镇汐 阅读(10196) 评论(111) 推荐(244) 编辑
摘要: 从本篇开始,本系列将进入实战演练阶段。 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠。不过我的精力很有限,文章进度越来越慢,所以准备切换一下介绍顺序,把实战演练提前,以方便你阅读代码。实战演练介绍 本系列实... 阅读全文
posted @ 2015-04-19 23:20 何镇汐 阅读(8931) 评论(58) 推荐(62) 编辑
摘要: 上一篇介绍了我对几种实体的认识,本篇将介绍几种服务的用法。 预告一下本系列后续计划,本篇之后,准备进入实战演练阶段,先介绍如何快速解决CRUD操作,从如何使用PD数据建模到使用CodeSmith生成代码,先带你感受一下,再回过来介绍框架内部元素,以免你在阅读时昏昏欲睡。应用服务介绍 对于一个... 阅读全文
posted @ 2015-04-08 23:02 何镇汐 阅读(7574) 评论(49) 推荐(120) 编辑
摘要: 本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较。领域实体为何不能一统江湖? 当你阅读我或其它博主提供的示例代码时,会发现几种类型的实体,这几种实体初步看上去区别不大,只是名称不同,... 阅读全文
posted @ 2015-03-31 01:05 何镇汐 阅读(12579) 评论(64) 推荐(66) 编辑
摘要: 最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间。不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新。本文继续介绍表现层和Asp.net Mvc,我将在本篇讨论一些重要的设计问题和封装技巧。是否需要将控制器分离为独立项目 经常有人问我,是否有必要将控制器从W... 阅读全文
posted @ 2015-03-16 16:11 何镇汐 阅读(7986) 评论(64) 推荐(151) 编辑
摘要: 本文将介绍表现层及ASP.NET MVC的一些要点,特别是ASP.NET MVC的一些抽象和封装技巧,如果你对MVC还不了解,可以参考《ASP.NET MVC4 高级编程》,作者Jon Galloway等,这本书由ASP.NET MVC团队成员编写,相当不错。表现层的职责 表现层的职责是展示和... 阅读全文
posted @ 2015-02-02 19:56 何镇汐 阅读(4211) 评论(23) 推荐(22) 编辑
摘要: 上文介绍了我选择EasyUi作为前端框架的原因,并发放了最新Demo。本文将对这个Demo进行一些介绍,以方便你能够顺利运行起来。 这个Demo运行起来以后,是EasyUi的一个简单CRUD操作,数据库中也只有一个简单的表,整个操作不带任何业务逻辑。 看到这里,不少朋友难免感到失望,搞这么复... 阅读全文
posted @ 2015-01-30 14:57 何镇汐 阅读(5499) 评论(27) 推荐(79) 编辑
摘要: 对于BS管理系统,我很长一段时间都工作在Asp.Net Web Form上,Web Form的主要优势是可以使用服务器端控件,以类似CS的开发模式进行工作,通过拖拽控件和定义事件处理函数,极大的简化了BS的开发。服务器端控件会在渲染阶段把自身输出为Html标签,对我们完全透明,当需要设置相关属性... 阅读全文
posted @ 2015-01-27 14:59 何镇汐 阅读(10164) 评论(251) 推荐(184) 编辑
摘要: 今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误。 我增加了几个单元测试来捕获错误,代码如下。 /// /// 测试值为枚举 /// [TestMethod] ... 阅读全文
posted @ 2015-01-24 02:22 何镇汐 阅读(3743) 评论(6) 推荐(11) 编辑
摘要: 信息系统的查询需求千变万化,在仓储中为每个查询需求创建一个特殊方法,将导致大量乏味而臃肿的接口。 一种更加可行的办法是,在应用层服务中描述查询需求,并通过仓储执行查询。 为了能够更好的描述查询需求,可以将查询功能从仓储中抽取出来,专门创建一个查询对象。 查询最复杂的部分是条件过滤,这也是查... 阅读全文
posted @ 2015-01-20 22:24 何镇汐 阅读(3360) 评论(4) 推荐(8) 编辑
摘要: 前面已经做了一些准备工作,本篇将介绍查询条件的封装,它是规约模式的一个应用。 规约使用一个对象来封装谓词,我之前已经介绍过它在验证方面的应用,本篇是规约模式在查询方面的应用。 规约的强大之处在于,能够将一堆杂乱无章的条件判断或查询条件封装起来,以一个清晰的概念来表达,并使得这些谓词具备了可复... 阅读全文
posted @ 2015-01-20 01:26 何镇汐 阅读(4193) 评论(14) 推荐(12) 编辑
摘要: 本篇介绍的表达式生成器,用于动态创建表达式。 在Util项目Lambdas目录中,添加ExpressionBuilder,代码如下。using System;using System.Linq.Expressions;namespace Util.Lambdas { /// //... 阅读全文
posted @ 2015-01-06 19:29 何镇汐 阅读(2185) 评论(1) 推荐(7) 编辑
摘要: 当你使用可空的值类型时,你会发现取值很不方便,比如Guid? obj,你要从obj中获取值,可以使用Value属性obj. Value,但obj可能为null,这时候就会抛出一个异常。 可空值类型提供了一个HasValue属性,它可以识别出obj是不是一个null值,每当你获取可空值都需要加上... 阅读全文
posted @ 2015-01-06 19:02 何镇汐 阅读(1880) 评论(5) 推荐(5) 编辑