Skip to content

Latest commit

 

History

History
137 lines (86 loc) · 6.37 KB

episode-048.md

File metadata and controls

137 lines (86 loc) · 6.37 KB

.NET 每周分享第 48 期

卷首语

Happy New Year.

image

Tiobe 发布了年度语言, C# 以 +1.43% 的增长率荣获 2023 年度开发语言。

文章推荐

1、按条件加载中间件

image

在 ASP.NET Core 应用程序中,我们通常注册中间件的方式定义自己的业务开发逻辑,如果有些中间你需要在满足特定的条件的时候才会执行,那么可以使用 UseWhen 的拓展方法。

中间件

internal class TimingMiddleware
{
    private readonly RequestDelegate _next;

    public TimingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var stopWatch = Stopwatch.StartNew();

        context.Response.OnStarting(() =>
        {
            context.Response.Headers["X-took"] = $"{stopWatch.ElapsedMilliseconds} ms";
            return Task.CompletedTask;
        });

        await _next(context);
    }
}

注册中间件

app.UseWhen(
    context => context.Request.Path.StartsWithSegments("/api"),
    builder => builder.UseMiddleware<TimingMiddleware>()
);

这里只有请求的 path 中包含了 api 才会执行 TimingMiddleware。从源码上看,它是通过创建一个新的 IApplication ,在条件满足的时候使用新的 IApplication 执行。

2、WPF 已经死了

image

WPF 是 Windows 平台上开发桌面应用程序的利器,随着 .NET 的开源和 WPF 并不支持其他桌面系统,WPF 的生态前景不容乐观,和 Avalonia 比起来,不管是开源社区的积极性和下载量,都有取代的可能。

3、SearchValue

image

.NET 一直致力于性能提升,有一种性能提升是 “先付款,再收益”的模式。那么“付款”的形式有两种

  1. 在编译的时候,比如 build task 或者 source generator
  2. 在运行的时候,存在冷启动的问题

.NET 8 中的 SearchValue 就是第二种。

4、var 关键字

image

这是 Reddit 上的一个讨论

使用 var 关键字是否可行

原帖作者认为 var 关键字使得变量类型变得不清晰。但是我认为 var 类型是不错的类型

  1. 使用 IDE 可以很方便的查看
  2. 不适用 var, 是的一些代码的长度变得非常长,比如 List<int> list = new List<int>()
  3. Linq 中,var 可以避免写一些隐式类型,比如 var obj = list.Select(i => new { Val = i; Name = i.ToString()})

5、.NET 平台密码管理最佳实践

image

在密码存储过程中,最重要的一点的是不能存储用户密码的原文,因为哪怕是数据库泄露,也不会产生密码泄露的问题。在安全领域还有一个重要原则是不能自己发明安全领域的算法。.NET 提供了 PBKDF2 算法来提供加密,而且在 ASP.NET Core Identity 包中使用。 整个流程包含四个步骤:

  1. 用户提供密码
  2. 使用一个 Salt
  3. 使用一个伪随机算法比如 SHA-256
  4. 迭代若干次

代码如下

var password = "Correct Horse Battery Staple"u8;
const int keySize = 256 / 8;
var salt = RandomNumberGenerator.GetBytes(keySize);
const int iterations = 600000;
var key = Rfc2898DeriveBytes.Pbkdf2(password, salt, iterations, HashAlgorithmName.SHA256, keySize);

6、关闭 DbConnection?

image

在 database 中我们会涉及到 DbConnection, DbCommandDbReader , 它们都有 Close 的方法用来释放相应的资源,那么我们需要依次调用它们吗?本文作者查看了 SqliteConnection 的实现,发现在调用 DbConnectionClose 方法会关闭相关的 DbCommand, 而调用 DbCommandClose 方法,也会调用关联的的 DbReaderClose 方法,所以没有必要依次调用它们的 Close 方法。

开源项目

1、2023 .NET 开源统计

image image

2、2024 年 .NET 技能提升

image

新的一年,查看一下这个开源项目列出的 .NET 技能提升清单.

3、TestContainer

TestContainer 是一个集成测试的工具,我们都知道单元测试是应该不依赖外部服务,比如数据库,网络。我们都需要在单元测试中将他们抽象。但是我们在集成测试中还是需要完整的测试他们,所以 TestContainer 可以借助容器化工具完成完整的测试。

4、One Billion Row Challenge

image

在 GitHub 上出现了一个有趣的挑战,使用任何编程语言读取十亿行的文件,该文件的内容是一个气象站获取的温度采样点,输出的内容是该气象站的平均温度,最低温度和最高温度。可以使用任何优化的方法,让这个程序在最短的时间内完成。这个repo 包含了 .NET 编程语言的实现。