Happy New Year.
Tiobe 发布了年度语言, C#
以 +1.43% 的增长率荣获 2023 年度开发语言。
1、按条件加载中间件
在 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 已经死了
WPF 是 Windows 平台上开发桌面应用程序的利器,随着 .NET
的开源和 WPF
并不支持其他桌面系统,WPF 的生态前景不容乐观,和 Avalonia
比起来,不管是开源社区的积极性和下载量,都有取代的可能。
.NET 一直致力于性能提升,有一种性能提升是 “先付款,再收益”的模式。那么“付款”的形式有两种
- 在编译的时候,比如 build task 或者 source generator
- 在运行的时候,存在冷启动的问题
.NET 8 中的 SearchValue
就是第二种。
4、var 关键字
这是 Reddit 上的一个讨论
使用
var
关键字是否可行
原帖作者认为 var
关键字使得变量类型变得不清晰。但是我认为 var
类型是不错的类型
- 使用 IDE 可以很方便的查看
- 不适用 var, 是的一些代码的长度变得非常长,比如
List<int> list = new List<int>()
- 在
Linq
中,var 可以避免写一些隐式类型,比如var obj = list.Select(i => new { Val = i; Name = i.ToString()})
在密码存储过程中,最重要的一点的是不能存储用户密码的原文,因为哪怕是数据库泄露,也不会产生密码泄露的问题。在安全领域还有一个重要原则是不能自己发明安全领域的算法。.NET
提供了 PBKDF2
算法来提供加密,而且在 ASP.NET Core Identity
包中使用。
整个流程包含四个步骤:
- 用户提供密码
- 使用一个 Salt
- 使用一个伪随机算法比如 SHA-256
- 迭代若干次
代码如下
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);
在 database 中我们会涉及到 DbConnection
, DbCommand
和 DbReader
, 它们都有 Close
的方法用来释放相应的资源,那么我们需要依次调用它们吗?本文作者查看了 SqliteConnection
的实现,发现在调用 DbConnection
的 Close
方法会关闭相关的 DbCommand
, 而调用 DbCommand
的 Close
方法,也会调用关联的的 DbReader
的 Close
方法,所以没有必要依次调用它们的 Close
方法。
1、2023 .NET 开源统计
新的一年,查看一下这个开源项目列出的 .NET 技能提升清单.
TestContainer
是一个集成测试的工具,我们都知道单元测试是应该不依赖外部服务,比如数据库,网络。我们都需要在单元测试中将他们抽象。但是我们在集成测试中还是需要完整的测试他们,所以 TestContainer
可以借助容器化工具完成完整的测试。
在 GitHub 上出现了一个有趣的挑战,使用任何编程语言读取十亿行的文件,该文件的内容是一个气象站获取的温度采样点,输出的内容是该气象站的平均温度,最低温度和最高温度。可以使用任何优化的方法,让这个程序在最短的时间内完成。这个repo 包含了 .NET
编程语言的实现。