最近微软在自己的招聘网站上发布了职位,要求熟练使用 C#
,而且工作内容是负责 Microsoft 365
产品。那么是否意味着微软要摒弃 C#
拥抱 Rust
呢?
这个话题在 Reddt 上也又相关的讨论,我的看法是,没有语言都有自己擅长的使用场景,这个招聘信息并没有太多的值得注意的地方。
Reddit 上有一个用户说 Aspire
项目会在 5 年内死亡,视频作者对这个看法发表自己的观点:
- 每个大的公司都会停止开发一些产品和项目。
- Aspire 仍然处于 Preview 状态,但是不停的提供新的功能
但是令人担心的是 Aspire
很多包都是微软维护的,这个并不能保证随时能得到更新。
Dev Tunnel 是 Visual Studio 推出的实验性功能,它主要解决的是在移动开发领域,应用程序在和后端服务通信时候调试问题,比如本地开发的时候只能通过 localhost
访问,而移动应用模拟器并不能直接访问开发机器。这给调试工作增加了困难。而 Dev Tunnel 可以提供一个域名可以直接访问,而且调式仍然发生在本地。
1、HTTP Redirect 特殊处理 Authentication Header
在 ASP.NET Core
中,如果返回 301 redirect
这样的请求,那么后续的请求会将 Authentication
头部信息丢失,这是因为 HTTP
协议的规范。
Polly
8.0 版本引入了 Chaos Engineering
功能,它能够主动引入 Fault 的机制,这样要求我们的应用程序能够主动进行 Resilience
相关的操作。它主要包含四种类型的策略
- Fault: 引入异常
- Outcome: 插入假的输出
- Latency: 增加延迟
- Behavior: 开启额外行为
在 HttpClient
中示例
- 创建
HttpClient
var httpClientBuilder = builder.Services.AddHttpClient<TodosClient>
(client => client.BaseAddress = new Uri("https://jsonplaceholder.typicode.com"));
- 引入
ResilienceHandler
httpClientBuilder.AddResilienceHandler("chaos", (builder, context) =>
{
var chaosManager = context.ServiceProvider.GetRequiredService<IChaosManager>();
builder
.AddChaosLatency(new ChaosLatencyStrategyOptions
{
EnabledGenerator = args => chaosManager.IsChaosEnabledAsync(args.Context),
InjectionRateGenerator = args => chaosManager.GetInjectionRateAsync(args.Context),
Latency = TimeSpan.FromSeconds(5),
})
.AddChaosFault(new ChaosFaultStrategyOptions
{
EnabledGenerator = args => chaosManager.IsChaosEnabledAsync(args.Context),
InjectionRateGenerator = args => chaosManager.GetInjectionRateAsync(args.Context),
FaultGenerator = new FaultGenerator().AddException(() => new InvalidOperationException("Chaos strategy injection!"))
})
.AddChaosOutcome(new ChaosOutcomeStrategyOptions<HttpResponseMessage>
{
EnabledGenerator = args => chaosManager.IsChaosEnabledAsync(args.Context),
InjectionRateGenerator = args => chaosManager.GetInjectionRateAsync(args.Context),
OutcomeGenerator = new OutcomeGenerator<HttpResponseMessage>().AddResult(() => new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError))
});
});
这样,当我们使用 TodosClient
的时候,在发起 HTTP
请求的时候就会有几率触发相应的 Fault
行为。
3、ASP.NET Core Functional Test
不同于单元测试,功能测试(或者集成测试)是一种端到端的测试,它会尽可能的测试软件或者系统对外界暴露的接口测试,而且外部依赖保持一致。在 ASP.NET Core
中,我们对外暴露的是 Web API 请求,依赖可能是数据库,文件系统访问等等。我们可以借助两个库完成上述的的要求
- Microsoft.AspNetCore.Mvc.Testing
该库的作用是拷贝应用程序的依赖至测试功能,并且内容根目录内容至测试工程下,并且提供了 WebApplicationFactory
来启动测试服务。
public class IntegrationTestWebApplicationFactory : WebApplicationFactory<Program>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureTestServices(services =>
{
services.RemoveAll(typeof(DbContextOptions<ApplicationDbContext>));
// Add Integration test Dbcontext
});
builder.UseEnvironment("Development");
}
}
- TestContainer
这个库帮助我们运行一个 Container,然后将我们的外部依赖,比如数据库给运行起来,这样就能在测试的时候直接连接该数据库。
PostgreSqlContainer _dbContainer = new PostgreSqlBuilder()
.WithImage("Postgres:latest")
.WithDatatabase("runtrack")
.WithUserName("User")
.WithPassword("password")
.Build()
这样就能获得一个 Postgre
数据库,在我们 WebApplicationFactory
构造 WebHost
的时候,将它作为数据库的来源。
.NET 8 Build 引入了新的日志输出框架: TerminalLogger
, 相对于其他默认的日志输出有如下的优势
- Warning 和 Error 安装目前框架分组
- 通过颜色让输出更加容易阅读
- 超链接到build 主要输出
- 展示每个 build target 耗时
- 编译最终结果更加清晰
- 默认日志输出
- TerminalLogger 输出
在 C# 11
中包含了模式匹配功能可以帮助写出更加优雅的代码,尤其是集合的 Null
或者空判断。
var collection = new Collection<object>();
if (collection is null or [])
{
Console.WriteLine("collection is not null or empty");
}
var array = (string[])null;
if (array is null or [])
{
Console.WriteLine("array is null or empty");
}
array = Array.Empty<string>();
if (array is null or [])
{
Console.WriteLine("array is null or empty");
}
1、coravel
Coravel
是 .NET
生态中用来实现定时任务的库,不同 Hangfire
或者 Quartz
,它支持异步和依赖注入编程方式,而且支持 Fluent
编程方式,在 ASP.NET Core 中的实例
builder.Services.AddScheduler();
app.Services.UseScheduler(scheduler =>
{
scheduler.Schedule(() =>
{
Console.WriteLine("Every second.");
})
.EverySecond();
});
Visual Studio 一款插件,可以展示 EF Core
查询语句的执行计划,这个对查询优化工作非常有帮助。