Furion 2.0.0:.NET 开发者不可忽视的框架

来源: 投稿
作者: dotNET中国
2021-04-19

star fork GitHub stars GitHub forks GitHub license nuget

让 .NET 开发更简单,更通用,更流行。

发展大事记

自 Furion 诞生一来得到高速发展最大的原因是弥补了 .NET 这么多年没有对标 Java Spring 的框架,所以 Furion 的诞生迅速吸引了非常多的 .NET 开发者,QQ 群成员达到了 5500 人+

以下是 Furion 的发展大事记:

  • 2020 年
    • 2020 年 06 月 29 日,在百小僧公司成立 8 周年之际在 Gitee 平台创建了 Fur 仓库。
    • 2020 年 09 月 01 日,正式写下第一行代码。
    • 2020 年 10 月 22 日,Fur 在 Gitee 平台获得 1000 stars.
    • 2020 年 11 月 11 日,单身节当天发布了 1.0.0 正式版。
    • 2020 年 11 月 20 日,Fur 改名为 Furion。
    • 2020 年 11 月 23 日,Furion Logo 由之前的 奶牛 更换为 袋鼠。
    • 2020 年 12 月 22 日,Furion 在 Gitee 平台获得 2000 stars。
  • 2021 年
    • 2021 年 02 月 20 日,Furion 捐赠项目到 dotNET China 组织。
    • 2021 年 03 月 05 日,Furion 在 Gitee 平台获得 3000 stars。
    • 2021 年 04 月 01 日,Furion 所在群 dotNET China 突破 5000 人。
    • 2021 年 04 月 06 日,Furion 在 Gitee 平台获得 4000 stars。
    • 2021 年 04 月 19 日,Furion 正式发布 2.0.0 版本。

优秀的贡献者们

Furion 提供完善的代码注释和文档说明,以至于吸引了超过 110 个贡献者贡献代码感谢每一位为 Furion 贡献代码的朋友。

Giteye chart

2.0.0 版本为什么来的那么快

通过上面的大事记可以看出,Furion 从 1.0.0 版本过渡到了 2.0.0 版本只用了 5 个月的时间。相对于大部分的开源软件来说,这是非常短的主版本迭代周期。但是为什么依然需要发布 2.0.0 版本呢?有以下原因:

  1. 创造 Furion 之初没想到该项目短短几个月发展的如此之快,所以 1.x 版本很多功能代码都为了功能开发而开发,在架构设计、灵活维护性及性能方面处理不妥,导致后续拓展新功能带来了不少麻烦,可以说是在功能中制造更多的漏洞。
  2. 在这 7 个月开源中,每天面对使用者的庞大需求及用户指数增长的威压下,对 .NET 有了更高层次的理解。
  3. 开源过程中认识了很多朋友,也收获了 112 个贡献者对代码的改进,在他们贡献的代码中也让自己成长了不少。
  4. 最后一个是为了迎接 .NET 6 版本的到来。

所以,综上所述,花了近 15 天的时间对 Furion 的底层架构进行了大面积的重构及优化,其中包括删除了近 2700 行代码,31 个文件及底层架构模式的重大调整。

2.0.0 有什么亮点

亮点一:支持控制台应用程序开发

Furion 不再局限于 Web 应用开发还额外支持控制台应用程序开发。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace FurionWorkers
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .Inject();
    }
}

亮点二:内置强大的任务调度

// 每隔 1s 执行
SpareTime.Do(1000, (timer, count) => {
    Console.WriteLine("现在时间:" + DateTime.Now.ToString("yyyy-MM-dd HH🇲🇲ss"));
    Console.WriteLine($"一共执行了:{count} 次");
});
SpareTime.Do("* * * * *", (timer, count) => {
    Console.WriteLine("现在时间:" + DateTime.Now.ToString("yyyy-MM-dd HH🇲🇲ss"));
    Console.WriteLine($"一共执行了:{count} 次");
}, "cronName", "每分钟执行一次");

亮点三:支持跨平台的守护进程服务

using Furion.TaskScheduler;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace WorkerService1
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;

        public Worker(ILogger<Worker> logger)
        {
            _logger = logger;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                // 执行 Cron 表达式任务
                await SpareTime.DoAsync("*/5 * * * * *", () =>
                {
                    _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                }, stoppingToken, CronFormat.IncludeSeconds);
            }
        }
    }
}

亮点四:支持 Anno + Furion 微服务开发

亮点五:功能文档已经全部完成

本期更新

  • 新特性

    • [新增] 控制台应用程序及 Worker Services 支持 #I3K4DG
    • [新增] 完整任务调度功能 #I3IRUX
    • [新增] Cron 表达式解析 #I3IQ9Y
    • [新增] 支持 Swagger 自定义配置 swagger.json 地址模板 #I3IHMX
    • [新增] 支持配置动态 WebApi 区域 #I3IJAZ
    • [新增] 远程请求新增支持传入服务提供器 IServiceProvider #I3IVBL
    • [新增] 全局配置选型 SupportPackageNamePrefixs 配置,支持配置包前缀 #I3K0SN
    • [新增] 应用启动时支持 referenceassembly 类型程序集扫描 #I3K0SN
  • 突破性变化

    • [重构] 完整任务调度功能 #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
  • 不做实现

文档地址

项目地址

Furion 遵循 Apache-2.0 开源协议,欢迎大家提交 PR 或 Issue。喜欢可以给个 Star

展开阅读全文
15 收藏
分享
加载中
22 评论
15 收藏
分享
返回顶部
顶部