Skip to content

Latest commit

 

History

History
106 lines (88 loc) · 8.83 KB

README.md

File metadata and controls

106 lines (88 loc) · 8.83 KB

Hzdtf.FoundationFramework

基础框架系统,支持.NET和.NET Core平台,语言:C#,DB支持MySql和SqlServer,主要功能有抽象持久化、服务层,将业务基本的增删改查抽离复用;提供代码生成器从DB生成实体、持久化、服务以及MVC控制器,每层依赖接口,并需要在客户端将对应实现层用Autofac程序集依赖注入,用AOP提供日志跟踪、事务、模型验证等。对Autofac、Redis、RabbitMQ封装扩展;DB访问提供自动主从访问,Redis客户端分区。特别适合管理系统。

本框架必须运行在.NET Standard 2.0、.NET Framework 4.7.2和.NET Core 3.1.5以上。下载源码用Visual Studio 2019打开。 工程以Standard或Std结尾是标准库,以Framework或Frm结尾为Framework库,以Core结尾为Core库。 初始编译时会耗些时间,因为要从nuget下载包。 框架使用依赖接口注入,使用对象要优先依赖接口,用Autofac属性注入方式。 工程包含contract表示契约工程,专门定义接口以及抽象部分类;包含impl为实现接口的具体类。 实体类以Info结尾。

一、Comnon包 所有公共工具类库

二、Platform包 基于不同平台实现不同的配置类 使用配置是,直接用Contract项目里的IAppConfiguration

三、Logger包 框架自定义的日志组件 日志等级有:debug,info,wran,error,fatal,默认等级为debug,如设置info,则大于或info等级都会记录,而小于该等级(如debug)不会记录。等级在配置文件里可设置,配置名为:HzdtfLog:LogLevel:Default。

四、IOC包 DI与AOP的扩展功能,目前只实现Autofac扩展。提供了读入配置文件进行加载程序集进行注入,需要注入的类必须加上Inject特性描述;实现了部分的拦截器(AOP),如日志记录拦截、禁用拦截、授权拦截和参数验证拦截。注:使用拦截器的方法必须是virtual或override,因为框架使用的是类拦截。

五、Tool\CodeGenerator包 代码生成器工具,提供从数据库读取所有表,然后生成所有码(包含模型、持久化接口、持久化实现、服务接口、服务实现、Framework控制器和Core控制器),生成的代码只需要放在对应各在的项目工程里即可,具体生成的代码参考BasicFunction。 1、命名空间前辍:您的项目命名空间前辍,生成的所有代码都会以这个作为前辍。 2、此工具目前只支持MySql(5.0以上)和SQL Server(2008以上)。

六、Tool\EncryptionAndDecryption包 提供对字符串加解密工具,主要用在对数据库字符串加密。

七、Authorization包 提供针对不同平台进行用户授权验证,将用户授权信息存储到cookie里等公共操作。

八、Cache包 第三方的缓存组件封装,目前只实现了对Redis扩展,依赖于StackExchange.Redis组件。 1、封装了ConnectionMultiplexer对象,使用IConnectionMultiplexerManager接口 使用时必须要IConnectionMultiplexerManager得到Database,否则框架扩展的功能都使用不上。 2、扩展了针对对象存储到Redis的Hash类型,在ObjectSet(this IDatabase db, RedisKey key, object value, TimeSpan? expiry = null, CommandFlags flags = CommandFlags.None)里。 3、扩展了针对分布式锁的功能(轮询模式),在LockTake(this IDatabase db, RedisKey key, Action action, int retryIntervalMillisecond = 200, CommandFlags flags = CommandFlags.None) 4、扩展了针对分布式锁的功能(发布订阅模式,推荐使用),在 LockTake(this IConnectionMultiplexer connectionMultiplexer, RedisKey key, Action action, int timeoutMilliSecond = 5000, CommandFlags flags = CommandFlags.None) 5、如使用Core,则添加Hzdtf.Redis.Extend.Core引用。在appsetting.json里配置: "Redis": { "ConnectionEncrypt": false, "Connections": [ { "Key": "Key1", "ConnectionString": "127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381" } ]
} 如果有多种Redis,则用Key区分。 如果有主从,在使用从时,flags应使用CommandFlags.PreferSlave,会优先找从,如果从不可用,则找主。默认是找主

九、MessageQueue包 1、对消息队列进行扩展封装,目前只实现了RabbitMQ,核心都在rabbitMessageQueue.xml配置文件里,使用生产者或消费者,输入对应参数,会找这个配置文件找到对应的交换机和队列名。具体参考DEMO。 2、利用RabbitMQ对RPC进行封装,并巧妙使用了DispatchProxy代理类,使调用方使用调用远程,就像调用本地方法一样,具体参考RPC DEMO。

十、Persistence包 1、对持久化操作进行封装,包含一个表的基本增删改查(包括分页查)功能,并支持异步操作。此持久化依赖于Dapper组件。 2、提供了针对数据库事务方便操作,只需要在具体方法里加上Transaction特性描述即可。 3、关于ConnectionId:名称为连接ID(Guid),每个持久化方法里必须含有的参数,作用是为了在多个方法之间复用同一个连接对象,提高性能。原则是:哪里创建的连接ID哪里负责销毁,不是您创建的就不要自行销毁它。 4、DbConnectionManager数据库连接管理器:提供了相对智能的维护DB连接资源池,主要存在目的是为了连接ID而存在,并支持通过传入访问模式参数,自动进行主从操作。主数据库字符串配置名:ConnectionStrings:DefaultConnection;从数据库字符串配置名:ConnectionStrings:SlaveConnection,当没有配置从时,会自动找主。ConnectionStrings:Encrypt:表示字符串是否加密。

十一、Service包 俗称服务层,所有业务逻辑都放在此包里。 1、在方法里加了Auth特性,表示调用此方法前会验证当前用户是否有权限。 2、在方法参数里加了验证特性,调用此方法前首先会验证参数有效性,如: ModifyPasswordByLoginId([Model] CurrUserModifyPasswordInfo currUserModifyPassword, string connectionId = null),加了Model特性,会验证currUserModifyPassword里的属性有效值。验证方法与微软提供的模型验证一致。 3、所有服务层返回的方法都必须是ReturnInfo对象,该对象里的Code为0时,表示业务处理成功。非0为失败。 4、由工具自动生成代码统一由Generators文件夹包含,此处的文件最好不要改,如要扩展功能,则用部分类特性,新建Expand文件夹。

十二、Controller包 控制器包,提供基本的MVC控制器增删改查的抽象功能方法,符合RESTFull风格。

十三、BasicFunction包 基本功能,提供了用户、角色、角色权限、数据字典四大功能模块,还提供登录退出功能,可以理解为基本的范例。 注: 1、MenuCode:菜单编码,表示菜单的唯一编码,如用户菜单,角色菜单等。 2、FunctionCode:功能编码,表示一个具体功能,如添加、编辑、查询和删除等。 3、菜单与功能关联:如一个菜单具体哪些功能,可通过此处关联。 4、角色与菜单功能关联:如一个角色具体哪些权限,可通过此处关联。

在范例的控制器里有[MenuCode("User")],Action方法里有[FunctionCode("Add")],表示执行这个控制器的这个Action时,拦截器会判断该用户是否有用户的添加这个权限。

十四、Workflow包 工作流,提供流程审核功能,可配置送件、退件路线,由表单与流程组成一个审核流程。

十五、WebDemo包 提供Web的Demo网站程序,采用WebAPI方式,前后端分离,使用Bootstreap UI框架。运行时,先创建数据库,导入Doc\创建表与初始化基本数据_mysql.sql,目前只有MySql才做了基础数据。用户名:system,密码:123。 依赖注入程序集都在:assemblyConfig.json配置文件里,包含了要注入哪些程序集,以及哪些程序集要使用哪些拦截器。 所有要使用具体程序集(包含具体使用哪些对象)都要在客户端里装载,因为所有项目都依赖于接口,而不是依赖于具体实现,具体类里也不创建具体依赖类。

结语: 1、获取当前用户:UserTool.CurrUser,在客户端(WEB站点)里要实现获取当前用户的方法,如User.GetCurrUserFunc => 从Cookie或Session取出当前用户。 2、获取当前环境:UtilTool.CurrEnvironmentType (目前只有生产与测试环境,默认是生产) 3、获取具体日志对象:LogTool.DefaultLog,默认是ConsoleLog,如系统未使用依赖注入,又要改变记录日志方式,则需要在系统启动时手工设置此对象。 4、获取IOC的对象:框架使用的是属性注入,所以一般使用属性的公有权限,如下: public IUserService UserService { get; set; } 直接拿来使用,如要手工获取,则使用AutofacTool.Resolve<对象类型>()。 5、程序启动时,必须先加载依赖注入的对象,具体参考DEMO。