基于.net 5 和 Orleans 的 开发框架:Phenix Framework 7.5

Phenix Framework 7.5 for .net 5
Copyright © 2007, 2020 Phenixヾ Studio

发布地址:https://github.com/phenixiii/Phenix.NET7
技术交流群:206648373


20190522
1,发布轻量级的持久化引擎,支持Oracle、MySQL(20200510后支持PostgreSQL,20200707后支持SQL Server),封装ADO.NET,可同时操作多个(主库+分库)数据库
2,提供数据库的数据字典的查看方法,示例见Demo.Phenix.Core.Data.Schema
3,提供存放日志到本地或数据库的通用方法,示例见Demo.Phenix.Core.Log.EventLog
4,提供系统唯一的序列号,支持多线程、多进程、分布式应用,示例见Demo.Phenix.Core.Data.Sequence
5,提供连续递增的序列号,支持多线程、多进程、分布式应用,示例见Demo.Phenix.Core.Data.Increment
6,提供直接读取数据库数据DataReader功能,示例见Demo.Phenix.Core.Data.Common.DataReader


20190715
1,持久化引擎支持在实体属性上打System.ComponentModel.DataAnnotations.ValidationAttribute派生标签,提交对象/属性时会自动完成属性的有效性验证(验证失败抛出ValidationException)
以下默认规范会自动添加,不必手工打标签:
System.ComponentModel.DataAnnotations.RequiredAttribute,前提是属性值不允许为空的规范是按照表字段NOT NULL的话;
System.ComponentModel.DataAnnotations.StringLengthAttribute,前提是字符串属性值长度要求是按照表字段长度规范的话;
一旦手工打上标签,以上默认规范会被覆盖掉
2,持久化引擎支持在实体上实现System.ComponentModel.DataAnnotations.IValidatableObject接口,也可以实现Phenix.Core.Data.Validity.IValidation接口,提交对象时自动完成对象的有效性验证(验证失败抛出ValidationException)
3,提供实体类代码生成工具Phenix.Tools.EntityBuilder工程源码


20190804
1,提供WebAPI服务端Phenix.Services.Host工程源码
2,提供WebAPI服务的phenix7.js客户端源码,见\Phenix.Services.Host\wwwroot\lib目录,测试代码见\Phenix.Services.Host\wwwroot\test目录


20190807
1,Phenix.Services.Host可部署在KestrelServer+Docker环境中
2,Phenix.Core.Data.Database和Phenix.Core.Data.Common.DbCommandHelper的调用存储过程函数ExecuteStoredProc,返回值改为IDictionary<string, object>类型,为存储过程的调用结果集"参数名-参数值",如需转换为JSON格式请调用Phenix.Core.Reflection.Utilities.JsonSerialize(result)
3,增补Phenix.Core.Data.Schema.Table、Phenix.Core.Data.Schema.View、Phenix.Core.Data.Model.EntityBase<T>的查询函数,可读取DataReader内容返回实体对象或JSON格式的查询结果
4,增补Phenix.Core.Reflection.Utilities的JsonSerialize()函数,直接将DbDataReader导出JSON格式的查询结果,JSON格式的属性名为数据源的表/视图的字段名/别名


20190905
1,提供Phenix.Client工程,含HttpClient类Checkin、Logon、ChangePassword、Sequence、Increment、Message、UploadFile、DownloadFile、EventLog、Call等系列函数,示例代码见:Demo.Phenix.Client.HttpClient_Message、Demo.Phenix.Client.HttpClient_File
2,提供Phenix.Business工程,含Phenix.Business.UndoableBase<T>可撤销编辑的实体基类,为实体对象的编辑操作提供单级回滚的功能,示例见Demo.Phenix.Business.UndoableBase
3,约定时间戳字段以'_TIMESTAMP'后缀命名
4,增补Phenix.Core.Data.Model.EntityBase<T>功能具备乐观锁机制,Update()和UpdateRecord()函数提供checkTimestamp参数(默认true),保证在分布式架构下新数据不会被脏数据覆盖(会抛出Phenix.Core.Data.Validity.OutdatedDataException)


20190911
1,除了主键(后缀'_ID')、制单人(后缀'_ORIGINATOR')、制单时间(后缀'_ORIGINATE_TIME')、制单团体(后缀'_ORIGINATE_TEAMS')等水印字段外,约定系统自定义的水印字段用后缀'_WM'进行标识,以便在新增记录以后的历次修改中,这些字段都不会再被改动(即使编辑过实体对象也不会被持久化)
2,提供Phenix.Business.BusinessBase<T>可操作聚合树的业务基类,为聚合根对象的整颗聚合树提供编辑操作和持久化的功能
3,一旦为聚合树中某个节点的业务对象打上删除标记(IsSelfDeleted=true),调用SaveDepth()函数持久化时,只要数据库中存在物理外键,将会对它及其下的所有从业务对象(包括未加载到内存)的记录做级联删除


20190920
1,规定将WebAPI服务的Controller代码编写在各自的工程里,程序集的命名以"*.Plugin.dll"作为后缀,会被Phenix.Services.Host自动加载并装配到ApplicationParts中
2,发布Phenix.Services.Host时,可自动将Docker相关的文件写入到发布目录(Publish目录)中,方便部署到Docker
3,提供用户消息PULL和PUSH两套方法,具体见测试网页user-message.html


20191013
1,升级至for .net core3.0,开发工具 Visual Studio 2019 16.3.x及以上版本
2,提供服务接口IFileService以扩展系统自身的个性化的文件上传下载功能,框架代码见Phenix.Services.Extend工程里的FileService类,测试网页file.html


20191021
1,phenix7.js和Phenix.Client.HttpClient类的Call函数,补充'是否加密上传数据'、'是否解密返回数据'参数
2,提供业务类代码生成工具Phenix.Tools.BusinessBuilder工程源码


20191030
1,新增Phenix.Core.Threading.Timer类,提供定时执行任务功能,通过AddTimedTask()函数添加已实现Phenix.Core.Threading.ITimedTask接口的对象,会自动按照指定周期在一个独立线程里执行这个对象的Execute()函数
2,Phenix.Core.SyncCollections命名空间的集合类,都已实现Phenix.Core.Threading.ITimedTask接口,只要通过AddTimedTask()函数加入到Phenix.Core.Threading.Timer的定时执行任务队列里,会自动按照指定周期清理集合对象里过期的集合项,前提条件是集合项对象需实现Phenix.Core.SyncCollections.ICachedObject接口,指定它的失效时间以自动被从集合中剔除出去


20191102
1,提供非对称加密的公钥私钥生成工具Phenix.Tools.CreateKeyPair工程源码
2,数据库连接串配置记录存放在Phenix.Core.db(推荐使用SQLite Expert工具打开)库文件PH7_Database表里,以便在程序运行时无需通过编写代码注册数据库入口,可直接获取Phenix.Core.Data.Database对象,具体配置方法见示例记录的Remark字段内容


20191205
1,提供Phenix.Actor工程源码,封装Orleans3的客户端和服务集群配置方法和入口,以及一套轻量级的Actor开发框架,支持并行和分布式大规模服务架构设计
2,规定将Orleans服务的Grain及其接口代码编写在各自的工程里,程序集的命名以"*.Plugin.dll"作为后缀,默认会被Phenix.Services.Host自动加载并装配到ApplicationParts中
3,提供Phenix.Services.Plugin工程源码,包含用户身份验证和管理的UserGrain类、IUserGrain接口,及其代理UserGrain服务的UserProxy类,通过UserProxyFactory类注册到Phenix.Core的权限控制模块,注册方法(见Phenix.Services.Host):
Phenix.Core.Security.Identity.RegisterFactory(new Phenix.Services.Plugin.UserProxyFactory());


20191227
1,提供《Phenix.Services.Host.分布式服务架构.pptx》,讲解WebAPI(应用)服务和Orleans(领域)服务的搭建和部署方法
2,提供Phenix.Core.AppSettings应用系统配置工具,配置项定义方法参考Phenix.Services.Host的OrleansConfig类,系统部署实施时可根据需要在Database.Default或Phenix.Core.db库文件PH7_AppSettings表里做配置


20200107
1,添加Demo_Practice目录,用于存放实战演练项目的代码
2,添加Demo.InventoryControl库存管控演练项目到Demo_Practice目录
3,InventoryControl演练第一步,完成货架装卸货物的记录功能,见Demo.InventoryControl.Plugin_MySQL工程


20200205
1,提供Phenix.Algorithm工程源码,含ZeroOneKnapsackProblem类的0-1背包算法,支持"打包至少占有一定容量"、"打包至少占有一定容量且不低于一定价值"、"趋向最小规格且不考虑打包价值/只要满足最低打包价值"等约束条件,用法见Demo.Phenix.Algorithm.CombinatorialOptimization.ZeroOneKnapsackProblem工程
2,为Phenix.Algorithm工程添加BunchKnapsackProblem类,从M支集束的N个物品中挑选出一个尽可能整支和价值高的子集使其装满容量为W且允许有一定超载范围的背包
3,InventoryControl演练第二步,完成从Area-Alley-Location逐层自动挑货的标记功能,见Demo.InventoryControl.Plugin_MySQL工程


20200213
1,为Phenix.Actor工程封装Orleans Streams功能,见StreamProvider类
2,为Demo.InventoryControl.Plugin_MySQL工程添加Demo.InventoryControl.Plugin.oom设计文档
3,添加Demo.InspectionStation检查站作业演练项目到Demo_Practice目录
4,InspectionStation演练第一步,完成各作业点的地磅和车牌号的数据上报和读取、闸口的放行,作业点动态信息的发布和订阅,见Demo.InspectionStation.Plugin_MySQL工程


20200217
1,升级用户消息发布和订阅功能,允许在单一的消息ID上持续发送消息,可用于数据监控等业务场景,示例代码见:Demo.Phenix.Client.HttpClient_Message
2,为Phenix.Actor工程添加StreamEntityGrainBase类,可支持网格化的消息发布和订阅机制
3,InspectionStation演练第二步,中控的WebAPI客户端可订阅指定的多个作业点的动态信息,通过SignalR的推送机制实时获取到最新数据,见Demo.InspectionStation.Plugin_MySQL工程


20200220
1,提供《Phenix.Services.Host.分布式服务插件.pptx》,讲解WebAPI(应用)服务和Orleans(领域)服务的设计和开发方法
2,重构Phenix.Core持久化引擎,强调聚合和聚合根的领域对象模型,在采取分库分表策略的数据库部署场景下,一棵聚合树里的所有对象都随聚合根对象一起锁定在某个分库上进行持久化,持久化的路由算法是取自聚合根对象里一个映射'_RU'后缀字段的属性值经HASH取余得到具体的分库ID


20200315
1,提供《Phenix.Core.Data.持久层开发接口.doc》,讲解Phenix.Core持久化引擎的数据库集群、主库+分库、分库分表策略、使用接口和持久层开发方法
2,为Phenix.Services.Host工程添加Dashboard插件,可在浏览器上打开可视化Silo监控工具:http://localhost:8080/


20200408
1,添加《Phenix.Core.Data.持久层开发接口.doc》的"用DataReader获取实体对象/JSON的Sheet方法"章节
2,完善Phenix.Core.Log.EventLog功能,可防止连续写同一message造成本地日志瞬时暴涨的问题,中断重复日志强度阈值由静态属性BreakRepeatIntensityPerMinute控制,缺省为重复日志超过每分钟6000次
3,完善用户身份验证功能,可防止同一用户高频访问服务,中断服务请求强度阈值由Phenix.Core.Security.User的BreakRequestIntensityPerMinute静态属性控制,缺省为服务请求超过每分钟6000次
4,为Phenix.Actor工程添加TreeEntityGrainBase、StreamTreeEntityGrainBase、TreeEntityGrainProxyBase类,以支持树状结构Kernel的处理
5,丰富Phenix.Services.Plugin工程功能,注册用户可搭建起组织架构成为公司管理员,示例见Demo.Phenix.Client.Security.Identity_MyselfRootTeams


20200510
1,丰富Phenix.Algorithm工程ZeroOneKnapsackProblem、BunchKnapsackProblem的功能,可支持超大规格(容量)背包的运算
2,持久化引擎支持PostgreSQL,解决方案Phenix.NET7_PgSQL.sln,程序集输出目录Bin_PgSQL


20200516
1,提供Phenix.Core.Data.Schema.Table配置项ClassNameByTrimTableName(默认false),可根据自己Build Entity的需要设置类名取自被整理(如果第PrefixCount(默认3)位后是"_"则剔去其及之前的字符)的表名
2,提供Phenix.Core.Data.Schema.View配置项ClassNameByTrimViewName(默认false),可根据自己Build Entity的需要设置类名取自被整理(如果第PrefixCount(默认3)位后是"_"则剔去其及之前的字符, 如果第SuffixCount(默认1)位前是"_"则剔去其及之后的字符)的视图名
3,提供Phenix.Core.Data.Schema.Column配置项FieldNameByTrimColumnName(默认true),可根据自己Build Entity的需要设置类的字段名和属性名取自被整理(如果第PrefixCount(默认2)位后是"_"则剔去其及之前的字符)的表/视图字段名
4,丰富Phenix.Services.Plugin工程功能,公司管理员可为自己员工注册用户,为其配上所在团队(自己公司组织架构上的某个节点)、所担岗位,锁定/解锁、注销/恢复


20200523
1,修正系统管理员(用户名ADMIN,默认密码ADMIN)第一次无法登录注册的问题,并可增删改系统的岗位定义
2,提供Phenix.Core.Data.Rule.ValidationException数据验证异常类,用于将其ValidationMessage属性抛到客户端,客户端在拦截到HTTP状态409后,利用ValidationMessage属性的MessageType、StatusCode(取1000以上的整型值)分类处理异常消息Hint
3,增补Phenix.Core.Net.Api.ControllerBase的SelectRecord()函数,直接打包到分页查询结果DataPageInfo对象,DataPageInfo的DataName为实体类名,DataSize为数据量,PageNo为页码,PageSize为分页大小,PageBody为当前页JSON格式的记录数据


20200603
1,为持久化引擎添加条件表达式动态传参的功能,涉及Phenix.Core.Data.Schema.Sheet的UpdateEntity、UpdateRecord、DeleteRecord、SelectEntity、SelectRecord、RecordCount等函数,以及Phenix.Core.Data.Model.EntityBase<T>、Phenix.Core.Net.Api.ControllerBase的相关功能,紧随着条件表达式(criteriaLambda/criteriaExpression)后面都会有一个条件对象(criteria)的参数(可为JSON格式字符串/属性-属性值Dictionary)
2,Phenix.Core.Data.Schema.Sheet、Phenix.Core.Net.Api.ControllerBase的SelectRecord可按照接口定义(TSub)返回指定的属性值记录,而不是整个实体对象打包到JSON中
3,借助Phenix.NET6实现用户登录身份验证,可参考代码(Phenix.Services.Plugin)实现第三方身份验证


20200613
1,修正身份验证失败(比如登录口令输错)时浏览器F12提示"Origin null is not allowed by Access-Control-Allow-Origin"的问题
2,修订《Phenix.Core.Data.持久层开发接口.doc》,补充条件对象的使用方法,补充Phenix.Core.Data.Database的功能介绍
3,添加Demo.IDOS智能仓储作业系统演练项目到Demo_Practice目录,仅限于Phenix.NET7_PgSQL解决方案可见


20200707
1,持久化引擎支持SQL Server,解决方案Phenix.NET7_MsSQL.sln,程序集输出目录Bin_MsSQL
2,添加对WebAPI传入参数的验证,返回客户端HTTP状态为400的报文体是ValidationMessage对象,其StatusCode属性为400,Hint属性为验证消息
3,Phenix.Core.Data.Model.EntityBase<T>支持跨域传递并持久化,旧版实体类需升级(为初始函数添加 dataSourceKey 和 id 参数)或重新生成代码,类似这样:
[Newtonsoft.Json.JsonConstructor]
private User(string dataSourceKey, long id, string name)
: base(dataSourceKey, id)
{
_name = name;
}


20200718
1,调整表名/视图名/字段名映射规则,只要名称里出现的第一个'_'是在第1-4位之间,'_'及其前面的字符串都算作是前缀
2,提供统一的服务访问入口:/api/service/portal,代码见Phenix.Services.Plugin.Service.PortalController,能让客户端直接访问服务对象(建议用Command作为类名后缀)的公共静态函数,访问授权的控制方法与控制器上的保持一致,同样可以在这些函数上打[AllowAnonymous](或实现IAllowAnonymous的标签)、[Authorize](或实现IAuthorizeData的标签)、继承自Phenix.Core.Net.Filters.AuthorizationFilter的标签,访问授权的角色配置是在第一次被访问时自动保存在PH7_Controller_Role表中,获取方法参考Phenix.Services.Plugin.Api.Security.RoleController,角色的动态配置可自行开发功能来编辑PH7_Controller_Role表
3,为Phenix.Actor工程添加GrainBase、StreamGrainBase类,以提供Grain最基本的通用功能


20200808
1,将配置库初始化表从Phenix.Core.db迁移到Phenix.Core.Init.db
2,添加event-log.html到\Phenix.Services.Host\wwwroot\test目录,比照Controller和Command的不同编码方法(见Phenix.Services.Plugin.Api.Log里EventLogController和EventLogCommand),测试它们的不同调用方式
3,重构Phenix.Services.Extend工程,添加UserService以支持UserGrain功能扩展,添加UserMessageService以支持GroupMessageHub、UserMessageHub功能扩展


20200825
1,完善用户身份验证功能,提供Phenix.Core.Security.User的AllowMultiSessionRequest属性(默认true)的配置项,可控制是否允许多处会话(进程)发起请求,与AllowMultiAddressRequest属性(默认true)的配置项的区别是后者控制是否允许多处终端(IP地址)发起请求
2,为Phenix.Actor工程添加在Grain的调用链上传递用户身份信息的功能,Grain的接口需继承ISecurityContext才能实现本功能,ISecurityContext不能被Grain直接继承
3,为Phenix.Services.Plugin工程添加GroupMessageHub功能,前后端(前端为SignalR.Client)可订阅Grain等服务端对象推送出来的分组消息,消息推送写法参考:
await ClusterClient.Default.GetStreamProvider().GetStream<string>(ActorConfig.GroupMessageStreamId, 组名).OnNextAsync(消息);


20200915
1,为Phenix.Actor工程添加在Grain的调用链上记录调用和错误日志的功能,Grain的接口需继承ITraceLogContext才能实现本功能,ITraceLogContext不能被Grain直接继承
2,完善Phenix.Core.Log.EventLog功能,弃用PH7_EventLog表,改为按季度分为4个表(PH7_EventLog_1~4)记录当前季度发生的日志,下一季度用的日志表在使用之前会被自动清空


20201021
1,改写Phenix.Services.Host自动加载插件服务("*.Plugin.dll")、扩展服务("*.Extend.dll")的方法
2,改写Phenix.Actor自动编译插件服务("*.Plugin.dll")、契约服务("*.Contract.dll")的方法


20201030
1,采取Phenix.Core.Data.Schema.Column.FieldNameByTrimColumnName为false的映射策略的话,需要把表的主键命名为ID,视图中的非主表的主键可用别名区分,这样才能正确映射到实体类的ID属性上
2,IEntityGrain<TKernel> 分割出IEntityGrain
3,ITreeEntityGrain<TKernel>分割出ITreeEntityGrain


20201109
1,升级至for .net core5,开发工具 Visual Studio 2019 16.8.x及以上版本
2,Phenix.Core.AppSettings应用系统配置工具支持中英文切换,写入的中英文用‘|’分隔,读取时会判断Thread.CurrentThread.CurrentCulture.Name是否为'zh-'截取前半截还是后半截


20201118
1,提供《Phenix.NET7.搭建开发环境》
2,提供《Phenix.NET7.服务部署方法》
3,提供《Phenix.NET7.服务升级方法》



posted @ 2019-10-27 20:00  phenixiii  阅读(835)  评论(2编辑  收藏  举报