3.2K Star 8.9K Fork 3.6K

GVPdotNET China / Furion

 / 详情

📝 发布 Furion v4.8.7 版本

Done
owner
Opened this issue  
2023-02-22 12:11

版本说明

发布 Furion 和 Furion.Tools 和 Furion.Xunit v4.8.7 版本,适配 .NET8 Preview.1。

https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-1/

本期更新


本期亮点

1. LoggingMonitor 支持跳过特定参数记录

在 Furion 4.8.7.3+ 版本新增 [SuppressMonitor] 特性支持标记参数(支持类型,方法)不被记录,如:

[LoggingMonitor]
public string GetName([SuppressMonitor]SomeType type, int id)   // type 参数将跳过记录
{
    return nameof(Furion);
}

2. Sql 高级代理支持 IEnumerable<T> 、T[] 和 Tuple<(IEnumerable<T>, T[], T, List<T>) 混合返回值

public interface ISql : ISqlDispatchProxy
{
    [SqlExecute("select * from person where id = @id")]
    Person GetPerson(int id);

    [SqlExecute("select * from person where id = @id")]
    Task<Person> GetPersonAsync(int id);    // 异步

    // ----------------------------------------

    [SqlExecute("select * from person")]
    List<Person> GetPersons();

    [SqlExecute("select * from person")]
    Task<List<Person>> GetPersonsAsync();    // 异步

    // ----------------------------------------    

    [SqlExecute("select * from person")]
    Person[] GetPersons();

    [SqlExecute("select * from person")]
    Task<Person[]> GetPersonsAsync();    // 异步

    // ----------------------------------------

    [SqlExecute("select * from person")]
    IEnumerable<Person> GetPersons2();

    [SqlExecute("select * from person")]
    Task<IEnumerable<Person>> GetPersons2Async();    // 异步

    // ----------------------------------------

    // 更复杂的组合
    [SqlExecute(@"
select * from person where id = 1;
select * from person;
select * from person where id > 0;
select * from person where id > 0;
")]
    (Person, List<Person>, Person[], IEnumerable<Person>) GetPersons();
    
        // 更复杂的组合
    [SqlExecute(@"
select * from person where id = 1;
select * from person;
select * from person where id > 0;
select * from person where id > 0;
")]
    Task<(Person, List<Person>, Person[], IEnumerable<Person>)> GetPersonsAsync();    // 异步
}

3. 定时任务支持 Http 作业

HTTP 请求作业通常用于定时请求/访问互联网地址。

services.AddSchedule(options =>
{
      options.AddHttpJob(request =>
      {
            request.RequestUri = "https://www.chinadot.net";
            request.HttpMedhod = HttpMethod.Get;
            // request.Body = "{}"; // 设置请求报文体
      }, Triggers.PeriodSeconds(5));
});

作业执行日志如下:

info: 2023-03-11 11:05:36.3616747 +08:00 星期六 L System.Logging.ScheduleService[0] #1
      Schedule hosted service is running.
info: 2023-03-11 11:05:36.3652411 +08:00 星期六 L System.Logging.ScheduleService[0] #1
      Schedule hosted service is preloading...
info: 2023-03-11 11:05:36.5172940 +08:00 星期六 L System.Logging.ScheduleService[0] #1
      The <job1_trigger1> trigger for scheduler of <job1> successfully appended to the schedule.
info: 2023-03-11 11:05:36.5189296 +08:00 星期六 L System.Logging.ScheduleService[0] #1
      The scheduler of <job1> successfully appended to the schedule.
warn: 2023-03-11 11:05:36.5347816 +08:00 星期六 L System.Logging.ScheduleService[0] #1
      Schedule hosted service preload completed, and a total of <1> schedulers are appended.
warn: 2023-03-11 11:05:41.5228138 +08:00 星期六 L System.Logging.ScheduleService[0] #15
      Schedule hosted service will sleep <4970> milliseconds and be waked up at <2023-03-11 11:05:46.486>.
info: 2023-03-11 11:05:41.5542865 +08:00 星期六 L System.Net.Http.HttpClient.HttpJob.LogicalHandler[100] #9
      Start processing HTTP request GET https://www.chinadot.net/
info: 2023-03-11 11:05:41.5589056 +08:00 星期六 L System.Net.Http.HttpClient.HttpJob.ClientHandler[100] #9
      Sending HTTP request GET https://www.chinadot.net/
info: 2023-03-11 11:05:44.1305461 +08:00 星期六 L System.Net.Http.HttpClient.HttpJob.ClientHandler[101] #8
      Received HTTP response headers after 2566.7836ms - 200
info: 2023-03-11 11:05:44.1343977 +08:00 星期六 L System.Net.Http.HttpClient.HttpJob.LogicalHandler[101] #8
      End processing HTTP request after 2584.2327ms - 200
info: 2023-03-11 11:05:48.6475959 +08:00 星期六 L System.Logging.ScheduleService[0] #4
      Received HTTP response body with a length of <63639> output as follows - 200
      <!DOCTYPE html><html><head>
            <title>dotNET China | 让 .NET 开发更简单,更通用,更流行</title>
      ......
          </body></html>

4. 调整定时任务动态作业 DynamicJob 委托/方法签名

为了统一动态作业和普通作业的 ExecuteAsync 方法签名,故做出调整。

由:

options.AddJob((serviceProvider, context, stoppingToken) =>
{
      serviceProvider.GetLogger().LogInformation($"{context}");
      return Task.CompletedTask;
}, Triggers.PeriodSeconds(5));

调整为:

options.AddJob((context, stoppingToken) =>
{
      context.ServiceProvider.GetLogger().LogInformation($"{context}");
      return Task.CompletedTask;
}, Triggers.PeriodSeconds(5));

5. 远程请求 HttpRequestMessage 拓展方法 AppendHeaders

如需动态设置,可使用以下方式(添加参数拦截拦截器):

public interface IHttp : IHttpDispatchProxy
{
    // 通过参数拦截
    [Post("https://furion.baiqian.ltd/post")]
    Task<HttpResponseMessage> PostXXXAsync(string name, [Interceptor(InterceptorTypes.Request)] Action<HttpClient, HttpRequestMessage> action = default);
}

调用:

_http.PostXXXAsync("百小僧", (client, requestMessage) =>
{
    requestMessage.AppendHeaders(new Dictionary<string , object> {
        { "Authorization", "Bearer 你的token"},
        { "X-Authorization", "Bearer 你的刷新token"}
    });

    // 也支持对象,匿名方式
    requestMessage.AppendHeaders(new {
        Authorization = "Bearer 你的token",
        Others = "其他"
    });

    // 也可以使用原生
    requestMessage.Headers.TryAddWithoutValidation("Authorization", "Bearer 你的token");
    requestMessage.Headers.TryAddWithoutValidation("key", "value");
});

6. 定时任务立即执行方法

// 带返回值
var scheduleResult = _schedulerFactory.TryRunJob("job1");
// 不带返回值
_schedulerFactory.RunJob("job1");

7. 粘土对象可转换成 IEnumerable<T> 对象并实现 Lambda/Linq 操作

dynamic clay = Clay.Parse("{\"Foo\":\"json\",\"Bar\":100,\"Nest\":{\"Foobar\":true},\"Arr\":[\"NOR\",\"XOR\"]}");

// 将 clay.Arr 转换成 IEnumerable<dynamic>
IEnumerable<dynamic> query = clay.Arr.AsEnumerator<dynamic>();

// 实现 Lambda/Linq 操作
var result = query.Where(u => u.StartsWith("N"))
                  .Select(u => new
                  {
                      Name = u
                  })
                  .ToList();

文档更新

输入图片说明

输入图片说明

Comments (11)

百小僧 created任务
百小僧 added
 
重大调整
label
百小僧 added
 
文档
label
百小僧 changed description
百小僧 changed issue state from 待办的 to 已完成
百小僧 changed top level from High to Not top
Expand operation logs

2023年02月22日(今日),微软发布了 .NET8 Preview.1 版本,花了 4 个小时将 Furion 进行升级适配,解决了 3 处破坏性更改,11 处代码适配调整,超 9000个单元测试 100% 测试通过。

从今日开始,任何 Furion 版本(v0.x,v1.x,v2.x,v3.x,v4.x)都可以直接升级到最新版 v4.8.7,应用层无任何破坏性更改,底层全部做了兼容处理。

同时 Furion v5 彻底无依赖版本也做出相应调整,直接 .NET8 起步。

https://furion.baiqian.ltd/

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

百小僧 changed description

旧版本

输入图片说明

新版本

输入图片说明

支持支持!!!!!

百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description

预告 v4 版本最后一个新模块:👍邮件发送👍,将在下一个次版本 v4.8.8 发布。

邮件发送几乎是所有应用系统都必备的功能,过去大家都使用第三方 Mailkit 或者 FluntMail 等第三方模块。所以慎重考虑后,Furion 决定自己写邮件发送功能,不断迭代至完善,这样功能完全可控,出问题第一时间修复,想要什么功能就可以搞。

Furion 已经内置了很多系统必备的模块了,比如日志模块,定时任务模块,模板引擎模块等等,再也不用使用第三方了。😊

功能必须自主可控是 Furion 的初心,v5 版本将实现彻彻底底无第三方依赖,自己写 Swagger,自己写 Mapper。

没了第三方,就不用等第三方更新了,只有我的速度才能跟上你们项目迭代的速度,不加班是我们的倔强。

:smile: 老版本要是能无缝升级就好了

百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description
百小僧 changed description

Furion v4.8.7.10 版本发布,具体改进:

输入图片说明

输入图片说明

百小僧 changed description
百小僧 changed description

2023年03月15日,.NET 8 Preview 2,.NET 7.0.5,.NET6.0.15 发布

https://devblogs.microsoft.com/dotnet/march-2023-updates/


ASP.NET 8 Preview 2 主要变化

[FromBody] 特性现在支持多个了

输入图片说明

EFCore 8 Preview 2 主要变化

Sqlite 支持 JSON 列了

支持 Tree 型查询了(递归)!重大支持

百小僧 changed description
百小僧 changed description
百小僧 changed description

Furion v4.8.7 版本迭代了 24天 了,没想到还能修复 7个 问题。这是这近一个月修复的所有问题。

当然,问题越来越少,越来越难发现了

输入图片说明

百小僧 changed description
百小僧 changed description
百小僧 changed description