Skip to main content

v2 版本(归档) - 更新日志

Furion 框架升级/发版规则

升级前重点关注可能造成【破坏性】的标签类型

版本号规则:主版本号.次版本号.修订版本号.迭代版本号

  • 只要【确认】为框架 bug,则当天修复,当天发版,修订版本号 加 1
  • 只要 .NET SDK 版本更新,则当天升级,当天发版,修订版本号 加 1
  • 如果 .csproj 文件有变更,则当天发版,修订版本号 加 1
  • 如果新增 扩展包,为了版本号统一,则当天发版,修订版本号 加 1
  • 如果涉及到代码重构,则当天发版,次版本号 加 1,修订版本号 清 0
  • 如果 .NET SDK 主版本号升级,则当天发版,主版本号 加 1

如有意外不能当天发版,则会在 Issue 中说明具体发版时间,正常不会超过 3 天。

dotNET China/Furion

v2.20(已发布,全新事件总线)

v2.20+ 版本说明

Furion v2.20+ 版本后采用 Jaina 事件总线替换原有的 EventBus

  • 新特性
    •   远程请求支持 GET 请求自动转换 类类型 类型对象 #I4HR5Q
  • 突破性变化
    •   EventBus 模块,采用 Jaina 方式
  • 问题修复
    •   开启规范化结果并自定义全局异常导致异常经过 OnSucceeded 过滤器 bug #I4DTVL
    •   .NET5.0.5+ 微软底层修改了 [ApiController] 验证失败返回 IActionResult 类型 #I4ISOK
    •   远程请求上传文件异常 0c0752
    •   框架启动不支持环境变量 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 配置 !438
    •   定时任务内存和 CPU 占用及特殊情况下空异常问题 12c65de
    •   默认控制器启用规范化结果无效 bugc7a4a5e
    •   依赖注入 InjectionAttribute 特性的 ExceptInterfaces 单词拼写错误问题 !436
    •   Sql 命令参数传入 Clay 类型异常问题 #I4D21Q
  • 其他更改
    •   InjectionAttribute 代码 !435
    •   ToPagedList 泛型约束 d0244d
  • 文档
    •   事件总线新文档

v2.19(已发布)

  • 新特性
    •   定时任务监听器 ISpareTimeListener #I468Q1
    •   执行 Sql 支持 JsonElement 参数 61985d6
    •   Swagger 配置枚举及标签排序过滤器 #I46LON !404
    •   远程请求 application/octet-stream 类型默认支持 d9bad03
    •   远程请求代理模式请求报文头支持 IDictionary<string,object> 类型。0204c0a
    •   MongoDB 扩展类,添加更多常用操作方法 !423
    •   DateTimeOffset? 转换 DateTime 扩展(包含互换) !432
  • 问题修复
    •   Scoped.CreateEFCore 进行 Add-Migration 时候报空异常问题,原因是在 PM 环境中不存在根服务0853e74
    •   定时任务执行异常后异常一直驻留内存问题,修正为执行成功自动清空过去异常 197a62b
    •   Jwt 扩展包不正确的代码导致 IOptions 失效#I46LUP
    •   Swagger 枚举 Schema 过滤器不输出值问题 #I46LON !404
    •   Swagger 处理非 int 类型枚举转换 bug #I46QJ9
    •   视图引擎编译模板生成 dll 后再次加载出现 IL 格式化错误问题 ff52d38
    •   管道 Channel 读取器无法释放 Handler 对象问题 10f4a90
    •   Worker Services 下日志不输出问题 c482548
    •   远程请求 multipart/form-data 类型对接微信小程序上传文件 问题 d9bad03
    •   工作单元上下文在某些情况下共享事务失效问题 006d439
    •   Swagger 枚举值在 GET 请求中 Schema 显示不正确问题 fb72fd7
    •   远程请求 404 不走异常过滤器问题 !426
    •   自定义事件总线并发情况下调用完成后无法正确处理队列数据 !429
    •   v2.19+ 版本之后模块化开发加载外部程序集失效问题 !433
    •   定时任务 SpareTime 频繁检查导致 CPU 增高问题 aa0a2ee
  • 特别鸣谢

v2.18(已发布)

  • 新特性
    •   Furion.Tools.CommandLine 扩展库 查看源码
    •   基于 AsyncLocal<T>CallContext 实现 9057a21
    •   远程请求可配置请求异常重试策略 656da87
    •   远程请求 OnRequestFailded 事件 4a3da4b
  • 突破性变化
    •   Scoped 所有带返回值方法 656da87 -   ConfigureService 中调用 App.GetOptions<>() 获取配置逻辑 afa4ac3

在过去,很多开发者总是喜欢在 Startup.cs 配置服务的 ConfigureService 方法中解析服务,这样导致内存存在溢出风险,GC 无法回收。 正确的方式是尽可能的避免 ConfigureService 中解析服务。如果需要在【启动时】获取 配置选项,请使用 App.GetConfig<TOptions>(路径, true) 代替 App.GetOptions<TOption>

  • 问题修复
    •   v2.16+ 版本重构 AppDbContextBuilder 之后写错实体类型 #I45E6M
    •   远程请求单个值序列化错误处理方式 3282eba
    •   v2.17.3+ 单元测试创建 TestServer bug #I45JR3
    •   Retry.Invoke 正常方法死循环 bug !392
    •   刷新 Token 生成新 Token 存在数组/集合类型导致 Key 重复异常问题 aeea2b1
    •   远程请求序列化引用类型对象(不含 string)不正确的处理 93cf63a
    •   AppDbContext 默认租户属性受工作单元影响问题 e51557f
  • 文档
    •   包管理工具文档
    •   模板引擎、Sql 操作,数据库上下文 等等文档

v2.17(已发布)

  • 新特性
    •   IPC(Inter-Process Communication,进程间通信) 模块功能,目前提供进程内通信和共享内存进程外通讯 ProcessChannel
    •   远程请求 application/xmltext/xml 默认支持 4753a1a
    •   控制台全局异常拦截 4a4fe1f
    •   支持自定义 .json 配置文件扫描目录 3e2910a
    •   支持数据库实体接口显式实现接口配置 9610a0a
    •   控制台应用程序全局拦截 [IfException] 支持 4a4fe1f
    •   依赖注入模块接口可以限制实现类生存周期,实现类也支持复写生存周期 d2ce089
  • 突破性变化
    •   Oops.Retry() 重试策略功能至新类:Retry.Invoke() 6a7bbd0
    •   IHttpContextAccessor.SigninToSwagger() 扩展,请使用 IHttpContextAccessor.HttpContext.SigninToSwagger(),退出也一样
    •   全局处理 Request Body 重复读处理 Request.EnableBuffering() d92c24b
  • 问题修复
    •   规范化状态码过滤逻辑错误问题 #I44JYS
    •   非关系型数据库(内存数据库)注册及操作异常 e167651
    •   远程请求默认序列化问题 a55603b
    •   定时任务零点/整点提前一秒触发问题 #I4321L
    •   友好异常在子类重写抽象类方法内部抛异常无法获取的问题 4a4fe1f
    •  Web 项目抛异常问题 4a4fe1f
    •   数据库实体模型贴 [NotMapper] 特性无效 #I44MNO
  • 其他更改
    •   Swagger 生成泛型 SchemaIds 默认连接符,由 Of 改为 _ 81946b6

v2.16(已发布)

  • 新特性
    •   MVC 控制器支持规范化处理 #I427Z2
    •   throw Oops.Bah() 抛出业务异常(状态码 400
    •   UnifyResultSettings 规范化 json 配置选项 #I42NY7
    •   多语言自定义配置资源文件名及自定义程序集 #I434YJ
  • 突破性变化
    •   规范化结果 IUnifyResultProvider 参数 (破坏性更改) #I427Z2
    •   IJsonSerializerProvider 接口参数,去掉 inherit 参数 a55603b
查看变化
新版本自定义规范化结果
using Furion.DataValidation;
using Furion.DependencyInjection;
using Furion.UnifyResult.Internal;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Threading.Tasks;

namespace Furion.UnifyResult
{
/// <summary>
/// RESTful 风格返回值
/// </summary>
[SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))]
public class RESTfulResultProvider : IUnifyResultProvider
{
/// <summary>
/// 异常返回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode, errors: metadata.Errors));
}

/// <summary>
/// 成功返回值
/// </summary>
/// <param name="context"></param>
/// <param name="data"></param>
/// <returns></returns>
public IActionResult OnSucceeded(ActionExecutedContext context, object data)
{
return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data));
}

/// <summary>
/// 验证失败返回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
{
return new JsonResult(RESTfulResult(StatusCodes.Status400BadRequest, errors: metadata.ValidationResult));
}

/// <summary>
/// 特定状态码返回值
/// </summary>
/// <param name="context"></param>
/// <param name="statusCode"></param>
/// <param name="unifyResultSettings"></param>
/// <returns></returns>
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
{
// 设置响应状态码
UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);

switch (statusCode)
{
// 处理 401 状态码
case StatusCodes.Status401Unauthorized:
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "401 Unauthorized")
, App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
break;
// 处理 403 状态码
case StatusCodes.Status403Forbidden:
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 Forbidden")
, App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
break;
default: break;
}
}

/// <summary>
/// 返回 RESTful 风格结果集
/// </summary>
/// <param name="statusCode"></param>
/// <param name="succeeded"></param>
/// <param name="data"></param>
/// <param name="errors"></param>
/// <returns></returns>
private static RESTfulResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
{
return new RESTfulResult<object>
{
StatusCode = statusCode,
Succeeded = succeeded,
Data = data,
Errors = errors,
Extras = UnifyContext.Take(),
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
};
}
}
}
  • 问题修复
    •   MVC 控制器启用规范化处理后返回 new Json({}) 对象为 null 问题 #I4354S
  • 其他更改
    •   多语言底层设计,取消需要创建 Lang.cs 空类的要求 #I434YJ
    •   MiniProfiler 性能,减少不必要的监听

v2.15(已发布)

  • 新特性
    •   Db.GetDbRepository<定位器>() 静态方法 #I41MZP
    •   远程请求缺省序列化配置选项 #I41PBW
  • 问题修复
    •   自动扫描接口进行依赖注入获取首个接口错误 bug #I41D1M
    •   IRepository<TEntity> 没有实现 IRepository<TEntity, TDbContextLocator> 问题 #I41MZP
    •   远程请求缺省序列化 bug #I41PBW
    •   AppDbContext.Tenant 多租户空异常问题 #I421DA
    •   Worker Service 多个 Worker 定时任务阻塞问题 82a79cc
    •   Jwt 自动刷新机制时区处理问题,主要针对国外用户 #I41UB1 82a79cc
  • 其他更改
    •   系统启动性能,从 106M 减少到 84M
    •   大量底层代码,包大小从 391Kb 减少到 350Kb(不带注释版本仅 64Kb)

v2.13/v2.14(已发布)

  • 新特性
    •   简易字符串模板功能,支持远程请求、数据库模块、日志模块、事件总线模块、定时任务模块、异常模块、数据校验模块 #I402BL
    •   404 状态码规范化默认处理 #I408F5
    •   定时任务 ISpareTimeWorker 声明方式支持异步方法 #I40KWR
    •   自动配置二级虚拟目录 !354
  • 突破性变化
    •   框架依赖 SDK.NET 5.0.8 版本
    •   Db.GetNewDbContext() 静态方法 #I400BK
    •   数据库模块时态表扩展支持 #I405HI
    •   IJsonSerializerProvider 接口参数,新增 inherit 参数 #I3ZQU5
    •   AppSettings 配置的 LogEntityFrameworkCoreSqlExecuteCommand 名称为 OutputOriginalSqlExecuteLog #I40VVE
  • 问题修复
    •   Worker Services 定时任务边界值问题导致跳过单次任务 #I405NI
    •   Worker Services 独立发布后程序集扫描失效 bug #I3ZH3X
    •   远程请求如果配置了 Client 客户端但传入了空 RequestUrl 地址导致异常问题 #I40BC6
    •   规范化结果篡改非短路端状态码出现异常 bug #I408F5
  • 其他更改
    •   App.GetServiceProvider(type) 解析服务性能 #I40KXN
    •   视图引擎保存成文件流默认缓存区大小,从 4096 提升至 8192 #I40KH5

v2.10/2.11/2.12 (已发布)

该版本有多个破坏性更改,更新时请认真查看。

  • 新特性
    •   App.Configuration.Reload() 扩展 #I3XYI8
    •   ISubscribeHandler 支持异步方法定义 #I3XYHJ
    •   app.UseUnifyResultStatusCodes() 可配置修改返回状态码 #I3VZQH
    •   远程请求添加默认 User-Agent#I3W17C
    •   支持 Sql 高级代理切换数据库上下文定位器 #I3XFP6 #I3XDCR
    •   定时任务 CronFormat 自动识别 #I3Y7GT
    •   Sql 高级代理 拦截功能 #I3YHG4
    •   拦截远程请求所有异常处理 #I3YPDE
    •   远程请求配置 Timeout 超时时间 #I3YPPK
    •   RSA 加密算法 #I3YZNU !345
    •   DataTableDataSet 支持不指定强类型返回 #I3Z6RI
    •   Sql 字符串扩展方法设置 Timeout 超时时间 #I3ZKWF
    •   Sql 高级代理 [Timeout] 特性,设置超时时间 #I3ZKWF
  • 突破性变化
    •   FakeDelete 假删除/软删除所有功能 #I3XKII
    •   PBKDF2 加密算法 #I3Z0IO
    •   远程请求设置超时时间单位由 分钟 改为 #I3YPPK
    •   IJsonSerializerProvider 接口参数,新增 inherit 参数 #I3ZQU5
    •   [NonAutomatic] 特性名称为 [Manual] #I3XKKX
    •   [NotChangedListener] 特性名称为 [SuppressChangedListener] #I3XKLZ
    •   [ManualSaveChanges] 名称为 [ManualCommit] #I3XKNP
    •   DbContext.TenantIdQueryFilterExpression 名称为 DbContext.BuildTenantQueryFilter #I3XKTB
    •   [SkipScan] 名称为 [SuppressSniffer] #I3XN5N
    •   [SkipProxy] 名称为 [SuppressProxy] #I3XN7O
    •   Sql 执行,性能提升 20% #I3W33U
  • 问题修复
    •   动态 WebAPI 扫描控制器没有屏蔽没有注册的第三方控制器 #I3Y7TJ
    •   AppDbContext 设置 TablePrefix 无效: #I3Y57Q
    •   定时任务使用异步委托导致程序终止 bug #I3XVZ0
    •   事件总线一个 消息id 对应多个 Handler 只触发第一个#I3XYP0
    •   .ToPagedList() 分页方法传入小于或等于 0 的页码 #I3XNAN
    •   JSON 序列化默认 DateTimeOffset 异常 #I3XMOL
    •   继承 Serilog 日志在 Worker Service 生成重复日志 bug #I3WA0L !331
    •   粘土对象 动态添加 Clay 类型 bug #I3W9LW
    •   ValidationTypes.Numeric 校验数值类型正则表达式错误 #I3WADS
    •   数据库命令参数 DbParameterValueobject 类型的时候且不指定 #I3YKM6
    •   Oracle 数据库存储过程 游标参数 报错问题 #I3ZBYE
    •   Worker Services 采用独立发布后无法执行问题 #I3ZH3X
    •   远程请求如果无返回值序列化异常问题 !348
  • 其他更改
    •   支持 appsettings.json 等自定义配置文件中文命名 #I3YBFD
    •   远程请求配置命名客户端 BaseAddress 地址兼容处理 #I3YCRH
    •   框架无用代码、优化代码
    •   Furion非 Web 环境下性能
  • 文档变化
    •   会话和状态管理 文档 #I3YI3G
    •   远程请求、日志、数据库上下文、远程请求、Sql 高级代理文档
    •   配置文件 #I3Y2EV
  • 问答答疑
    •   dapper 多个数据源如何继承 #I3WUOI
    •   关于 SpareTime 多次执行问题#I3XEQU
    •   选项更改通知(热更新):数据库里的数据更改了如何通知选项进行改变? #I3XYI8
    •   SaaS 多租户添加时无法获取租户Id #I3Y5CF
    •   获取 _httpContextAccessor.HttpContext 为空#I3Y6BI
    •   Ubuntu 中使用 App.Configuration 方法读取不到值 #I3Y74H
    •   数据库上下文作用域问题 #I3YHXP
    •   使用 UnitofWork 提交事务,可以提交成功,但是系统会有错误 #I3YIWU
    •   数据库读写分离--非默认主库的从库随机该如何配置? #I3YVR7

v2.9.0 (已发布)

  • 新特性
    •   应用全局未托管资源监听,并实现特定时机释放非托管资源 #I3VXAU
    •   不包含 EntityFramework.Core 版本的 Furion.Pure#I3VGW8
    •   swagger 支持设置多语言方式,设置的语言自动添加到 api 地址后面 #I3VDTD
    •   动态 WebAPI 支持 [FromRoute] 非必填(选填)参数设置 #I3VFIM
    •   动态 WebAPI 参数支持配置路由约束 #I3VFIR
    •   MD5DESC 加密支持 大写 输出 #326
  • 突破性变化
    •   Furion 所有包生成 .snupkg 包,支持开发阶段直接调试 Furion 所有包源码 #I3VFIX
    •   repository.BuildChange() 方法的返回值,多返回一个 IServiceScope 对象 #I3VX3D
    •   JWT 刷新 Token 方法 AutoRefreshToken 参数 days 改为 minutes #I3VXNB
  • 问题修复
    •   App.GetOptionsSnapshot<> 从根服务解析异常 bug #I3VS2X
    •   远程请求如果出现异常,返回 Stream 为 null 导致异常的问题 #I3VSTU
    •   如果实体被跟踪后,无法执行删除操作 #I3W08P
  • 其他更改
    •   运行时内存,实现请求结束自动释放未托管资源 #I3VXAU
  • 文档变化
    •   App 静态类文档、远程请求文档、分表分库文档
  • 问答答疑
    •   动态 WebAPI,自定义根据方法名生成 [HttpMethod] 规则报错 #I3VKQG
    •   InsertAsync 的时候提示 ID 为空 #I3VS7E
    •   FirstOrDefault 自动过滤了 TanantId 字段 #I3W0VH
    •   对方接口返回 HttpConnectionResponseContent 远程请求拿不到返回值 #I3W17C
    •   查询方法 FindOrDefault 报错 #I3W830
    •   SqlNonQueryUnitOfWork 循环执行#I3W8WW
    •  Swagger 配置问题,导致 Swagger 中不能自动携带 token 授权的问题 #I3W934
    •   远程请求 SetBody 参数识别不了#I3WBM1
    •   Scoped.Create 里执行 sql.SqlNonQuery() 或者 obj.insert() 问题#I3WB5O
    •   调用函数或存储过程,怎么出参数据自定义对象?如 Oracle数据库的数组或记录 #I3W71W

v2.7.0/2.8.0 (已发布)

  • 新特性
    •   throw Oops.On("异常消息") 应用多语言支持 #I3UYC2
    •   Db.GetMSRepository() 获取主从库仓储静态方法 #I3UBSJ
    •   工作单元特性,支持静态类强制性开启共享事务 #I3S9N8
    •   EFCore 执行 sql 模式打印日志 #I3SE8X
    •   远程请求支持默认 HttpClient 配置 #I3SI17
    •   短 ID 生成功能 #I3T7JP
    •   [SensitiveDetection] 支持配置替换敏感词汇 #I3THIA
    •   SpecificationDocumentBuilder.DocumentGroupsSpecificationDocumentBuilder.CheckApiDescriptionInCurrentGroup(currentGroup, apiDescription) 公开方法#I3UDSY
  • 突破性变化
    •   自动扫描 .json.xml 文件并加载到配置中的代码和规则,同时移除默认 .xml 文件加载,只保留 .json 文件 #I3UJ3L
    •   分布式连续 GUID 代码 #I3UBK0
    •   Scoped.CreateUnitOfWork 名称为 Scoped.CreateUow #I3SJPU
    •   JWTEncryption.Validate 返回值,支持返回 TokenValidationResult #I3S2ND
  • 问题修复
    •   [DataValidation][SensitiveDetection] 多语言应用失效 #I3UH6U
    •   Scoped 系列方法异步出现 Task is cancel 情况 #I3SJF6
    •   Mysql 数据库的 ToPagedList 方法返回的结果进行遍历出现 MySqlConnection is aleady use 问题 #I3SJQ3
    •   tool/cli.psl 没有包含项目名称 #I3S1T6
    •   远程请求做上传文件时,没有传入 Body,程序直接跳过 #I3TKFH
    •   远程请求 multipart/form-data 内容分割符缺失 #I3TNO9
    •   远程请求代理拦截方式返回 HttpResponseMessage 问题 #I3V161
    •   repository.Database.SetCommandTimeout(600) 无法生效#I3VAQS
  • 其他更改
    •   支持规范化结果中间件判断是否跳过规范化结果 #I3T2AA
    •   更新部分列 UpdateIncludeNowAsync 具有二义性 #I3RW9Q
    •   框架底层性能,大大减少内存占用和溢出情况,启动内存从之前 136M 下将到 86M
    •   删除无用代码,优化不规范命名等
  • 文档变化
    •   Inject 说明文档 #I3TITA
    •   4.2.9 的示例代码文档,方法没有放在 class 中 #I3S9T5
    •   规范化结果 6.5.6 多分组排序图片引用错误 #I3UBOQ
    •   静态类 Scoped 文档
  • 问答答疑
    •   默认 MasterDbContextLocator 不随自定义的参数生成 #I3SDBB
    •   事件总线中订阅处理程序类获取不到用户信息,这个正常吗 #I3SS0U
    •   在有多租户过滤器的情况下,是否有一种方式查询全量的数据 #I3T0VI
    •   mysql 使用 &"tools/cli.ps1" 页面化加载表结构失败 #I3T4F8
    •   其他 Web 层的 Startup 优先执行 #I3T8IP
    •   辅助角色服务实现建议 #I3T906
    •   开启 easy connection 后同一内网地址浏览器可以正常访问,远程请求则无法访问#I3TA2U
    •   scope.ServiceProvider.GetService<IOtherService>不存在 #I3TQMV
    •   能否在 WPF 项目中使用呢? #I3TMCC
    •   Dapper 多个数据源 #I3TM9B
    •   L.GetSelectCulture() 方法异常 #I3TQS4
    •   循环中使用 IDGen.NextID() 得到的结果并不是连续的 #I3UAF6
    •   模块化动态加载插件支持通配符匹配.dll #I3UDT8
    •   MVC 模式,在 Controller 里快捷方式创建 View 页面出错 #I3UFGB
    •   数据库迁移没有种子数据 #I3UI7G
    •   SpareTimeAttribute 中 根据 Cron 表达式 自动匹配 Cron 表达式格式化方式 #I3UTKQ
    •   使用 workService 集成 SqlSugar 报错 #I3V8HJ
    •   sqlserver 2008 分页报错如何解决呢 #I3VF96

v2.5.0/2.6.0 (已发布)

  • 新特性
    •   虚拟文件服务,支持物理文件和嵌入资源文件 #I3RBR9
    •   读写分离/主从复制仓储 IMSRepositoryIMSRepository<TMasterDbContextLocator> 仓储,可进行随机或自定义获取从库
    •   数据脱敏处理 #I3R5ZF
  • 突破性变化
    •   InsertOrUpdate 一系列数据库操作方法 #I3RI9L
    •   所有包含 Exists 单词的数据库操作方法 #I3RJ0T
    •   分布式 GUID IDGenerater 静态类名称为 IDGen #I3RGUA
  • 问题修复
    •   远程调用方法错误,请求报文头 Headers 不能添加到 IHttpDispatchProxy 的子接口上 #I3RAF7
  • 其他更改
    •   应用启动性能,减少内存分配
  • 文档变化
    •   脱敏处理文档 #I3R6WZ
    •   文件系统文档、FS 静态类文档 #I3RCC4
    •   读写分离/主从复制、数据库仓储文档、Db 静态类 #I3R3B6
  • 问答答疑
    •   关于 Furion 集群部署 #I3R3J4
    •   升级最新框架以后, 数据库生成模型报错 #I3R7TP
    •   数据库上下文事务执行中,SaveNow 执行后有警告 #I3RAJI
    •   Hangfire 使用事务出现错误 #I3ROQ5
    •   如何实现 cli 不执行某些表的迁移,web 请求可以正常操作呢? #I3ROU5
    •   在使用定时任务时候出现的问题:继承 ISpareTimeWorker #I3RRZS
    •   MySql 时间差 8 小时处理 #I3RSCO
    •   Db.GetRepository<> 方法结合 [UnitOfWork] 后不可用 #I3RUK5
    •   事务开启失败问题 #I3RYJY
    •   支持 DbProvider 可动态配置 #I3RYPE
    •   WorkService 依赖注入 ISingleton 问题 #I3RZ1L
    •   ISpareTimeWorker 运行期动态修改 #I3S33Q

v2.4.0 (已发布)

  • 新特性
    •   支持自动加载模块化/插件 .xml 注释文件 #I3Q7XY
    •   AppDbContext.FailedAutoRollback 属性,可配置事务是否自动回滚 #I3QOUS
  • 突破性变化
    •   .NET 5 SDK 为 5.0.6 版本
    •   IJsonSerializerProvider.GetSerializerOptions() 接口方法 #I3QIJN
  • 问题修复
    •   通过 services.AddInject() 方式注册,模块化/插件不加载 #I3Q7XH
    •   种子数据返回 null 报空异常 #I3QCM5
    •   通过 Clay.Object 创建粘土对象后属性变小写问题 #I3QRV3
  • 其他更改
    •   Furion 框架底层性能,减少内存占用,提高应用初始化速度 92f8cc1
  • 文档变化
    •   JSON 序列化文档、规范化结果文档、数据库上下文文档
  • 问答答疑
    •   InsertOrUpdateNowAsync 报错 #I3QKO5

v2.3.0 (已发布)

  • 新特性
    •   Furion.Extras.DatabaseAccessor.MongoDB 扩展包支持 #I3PKST
    •   动态粘土类型直接转 objectdynamic 类型 #I3OY27
    •   Oops.Retry 方法,支持设置方法调用失败进行重试 #I3PJKQ
    •   JWTSettings 配置节点 Algorithm,用于配置加密算法 #I3PQGV
    •   repository.EnsureTransaction() 方法确保工作单元事务有效 #I3PVF1
  • 突破性变化
    •   支持.NET 6.0.0 Preview 3 版本 #I3P2C7
  • 问题修复
    •   使用数据库生成模型 tools/cli.ps1,从数据库表生成的实体异常 #I3PL18
    •   贴了 [NonUntify] 特性后,SwaggerExample Value 没有匹配正确 #I3PK0L
    •   SpareTimer.TallyCron 表达式中计数无效 #I3PWSE
  • 其他更改
    •   框架默认序列化应该从配置中读取,而非手动编写 #I3P1SJ
    •   SqlSugar 扩展库,支持非泛型仓储获取上下文操作对象 #I3PK2N
    •   支持分布式内存缓存可配置化 #I3POKD
  • 文档变化
    •   添加 JWTSettings 配置独立文档 #I3PQGW
  • 问答答疑
    •   软删除如果数据不存在,则报错 #I3PTVB
    •   多个类集成测试会造成数据库定位器多次注册,无法运行所有测试,只能一个类一个类的运行 #I3PXGY

v2.2.0 (已发布)

  • 新特性
    •   Clay 粘土类型,支持让 C# 创建一个弱类型对象并操作弱类型 #I3O2QQ
    •   Scoped.Create 带返回值重载 #I3O47J
    •   支持 Scoped.Create() 一系列方法支持传入作用域工厂 #I3OAP5
    •   支持事件总线同步执行方式 #I3OAW2
    •   [DataValidation] 跳过空字符串和空值验证 #I3OGEN
    •   Worker Service 可配置是否自动注册 Worker #I3OLW4
  • 突破性变化
  • 问题修复
    •   定时任务设置 cancelInNoneNextTime: false 一次也不执行 #I3O3N0
    •   SpareTime 自定义下次执行时间出现空异常 #I3O46X
    •   MiniProfiler 设置为 false 时,数据库上下文提交拦截器未添加 #I3OAWX
    •   [Consumes("application/x-www-form-urlencoded")]ModelQuery 配置同时配置导致空引用问题 #I3ODUR
    •   在 Grpc 中使用 jwt 授权出现空异常 #I3OW3I
  • 其他更改
    •   支持发布后代码精简配置,减少不必要的文件夹输出 #I3OAPF
    •   自动刷新 Token 机制,新增容错值处理,解决并发 Token 刷新失败问题 #I3OGYF
  • 文档变化
    •   粘土对象文档 #I3OG18
  • 问答答疑
    •   动态 WebAPI 如何获取接收文件 #I3O29B
    •   定时任务使用 Scope.CreateUow 引发的问题 #I3O2CD
    •   单文件发布程序工作不正常 #I3O4D8
    •   同时配置租户过滤器和软删除过滤器,最终的 sql 只生成了一种过滤条件 #I3OB0A
    •   HTTP 重定向 HTTPS 后跨域失效 #I3OB8R
    •   在 PostgreSql 数据库使用 rep.FirstOrDefault(u => u.Id == UserId); 引起异常 #I3O5OF
    •   定时任务有时能触发有时不能触发 #I3ORBE

v2.1.0 (已发布)

  • 新特性
    •   新增定时任务 ISpareTimeWorker 方式支持 [SpareTime("{配置路径}}] 方式 #I3NTUX
    •   定时任务支持异步委托 #I3NP96
    •   轻量级分布式连续 GUID 生成器 #I3NKLZ
    •   ClayObject 模块,处理 ExpandoObjectIDictionary<string,object> 类型 #I3N3J4
    •   Scoped.CreateUow(handler) 创建作用域并自动提交数据库更改方法 #I3NU3G
  • 突破性变化
    •   规范化结果接口 OnResponseStatusCodes 方法,新增 UnifyResultStatusCodesOptions 参数 #I3NDB9
    •   雪花 ID 实现代码 #I3NKLZ
  • 问题修复
    •   Swagger 不能支持非 int 类型的枚举 #I3NQM8
    •   数据库线程池多线程并发问题 #I3NR4L
    •   自定义控制器路由后且为方法参数指定了 [ApiSeat] 后生成路由重复 #I3NRF6
  • 其他更改
    •   支持应用启动的时候迁移种子数据 #I3NH3M
  • 文档变化
    •   分布式 ID 生成文档 #I3B6CX
    •   新增模块化开发文档 #I3NSUS
    •   20.4 字符串扩展方式 > 错误ToAESDecrypt 写成了 ToToAESDecrypt #
  • 问答答疑
    •   有关【定时任务/委托】的疑问 #I3N3EW
    •   统一返回格式支持自定义 #I3NU1G

v2.0.0 (已发布)

  • 新特性
    •   控制台应用程序及 Worker Services 支持 #I3K4DG
    •   完整任务调度功能 #I3IRUX
    •   Cron 表达式解析 #I3IQ9Y
    •   支持 Swagger 自定义配置 swagger.json 地址模板 #I3IHMX
    •   支持配置动态 WebApi 区域 #I3IJAZ
    •   远程请求新增支持传入服务提供器 IServiceProvider #I3IVBL
    •   全局配置选型 SupportPackageNamePrefixs 配置,支持配置包前缀 #I3K0SN
    •   应用启动时支持 referenceassembly 类型程序集扫描 #I3K0SN
    •   依赖注入 AOP 拦截获取方法真实特性 #I3LZBX
    •   EFCore 手动 SaveChanges() 特性 #I3N01Y
    •   支持 Cors 跨域更多配置 #I3N2J0
  • 突破性变化
    •   完整任务调度功能 #I3IRUX
    •   日志模块功能 #I3J2K0
    •   模板引擎功能 #I3J46E
    •   底层 EFCoreRepository 仓储 #I3J6W5
    •   sql 字符串扩展底层代码 #I3IVCE
    •   底层 SqlRepository 所有逻辑代码 #I3J6V6
    •   数据库实体扩展方法 #I3J609
    •   事件事件总线同步执行为异步方式执行 #I3J0WA
    •   框架底层 HttpContext.IsAjaxRequest() 扩展 #I3IVAA
    •   ValidationTypes.Required 验证 #I3KR85
  • 问题修复
    •   关闭 InjectMiniProfiler 参数后内存缓存无效 #I3IHLR
    •   在多租户中调用 Tenant 属性出现偶然性数据库上下文被释放的情况 #I3IC70
    •   Sql 代理中如果返回基元类型抛出不能将 object 转换成对应类型的异常 #I3IC84
    •   存储过程多返回值的时候,outputvalues 的 name 不是定义的 MSG 的 name,是 Msg 类型。 #I3IC7Y
    •   PhoneNumber 手机号验证正则表达式错误 #I3ID10
    •   依赖注入 AOP 拦截无法捕获内部异常 #I3IGCC
    •   全局拦截标记异常已被处理后异常过滤器依然执行 #I3J463
    •   自定义全局异常拦截器不起作用 #I3K1SJ
    •   在 WorkerService 模式下,还是使用 WebHostEnvironment 来判断 Host 环境,会导致错误 #I3LCQY
    •   定时任务 DoOnce 抛空异常 bug #I3M0ZT
  • 其他更改
    •   启动时程序集扫描类型 #I3K0SN
    •   App.GetConfig<>("key") 不支持获取单个值问题 #I3ILF1
    •   UrlEncode 应该用 Uri.EscapeDataString() 而不是 HttpUtility.UrlEncode #I3ICTK
  • 文档变化
    •   定位任务、后台任务文档 #I3JHHG
    •   辅助角色服务文档 #I3K5GN
    •   动态 WebAPI、规范化文档、数据库上下文文档
  • 问答答疑
    •   数据校验,自定义 ErrorMessage 无效问题 #I3ICL3
    •   最新 issue 中新增的“新增常用的 JSON 序列化方法” 会导致 AOP 拦截异常 #I3I7VE
    •   Furion.DatabaseAccessor.PrivateEntityBase 中的 TenantId 数据类型设置为 object #I3IQV6
    •   有关异常拦截和处理的疑问 #I3IUFZ
    •   DataValidation 在空值的情况下被忽略掉了#I3IWSM
    •   日志文档没有更新 #I3J1DX
    •   对于 webapi 简单类型参数,是否可以以 json 方式提交 #I3J18I
    •   IUnifyResultProvider 实现中如果 UnifyModel 的 type 不是范型会报错 #I3JBXF
    •   如何模块化开发新功能? #I3J7ZZ
    •   建议增加微服务中间件的集成 #I3JTZQ
    •   二级虚拟目录部署的 swagger 的 MiniProfiler js 报错 #I3IWLR