Skip to content

Latest commit

 

History

History
194 lines (135 loc) · 8.14 KB

episode-050.md

File metadata and controls

194 lines (135 loc) · 8.14 KB

.NET 每周分享第 50 期

卷首语

image

最近微软在自己的招聘网站上发布了职位,要求熟练使用 C#,而且工作内容是负责 Microsoft 365 产品。那么是否意味着微软要摒弃 C# 拥抱 Rust 呢? 这个话题在 Reddt 上也又相关的讨论,我的看法是,没有语言都有自己擅长的使用场景,这个招聘信息并没有太多的值得注意的地方。

行业资讯

1、Aspire 项目会死吗

Reddit 上有一个用户说 Aspire 项目会在 5 年内死亡,视频作者对这个看法发表自己的观点:

  1. 每个大的公司都会停止开发一些产品和项目。
  2. Aspire 仍然处于 Preview 状态,但是不停的提供新的功能

但是令人担心的是 Aspire 很多包都是微软维护的,这个并不能保证随时能得到更新。

2、Dev Tunnel

image

Dev Tunnel 是 Visual Studio 推出的实验性功能,它主要解决的是在移动开发领域,应用程序在和后端服务通信时候调试问题,比如本地开发的时候只能通过 localhost 访问,而移动应用模拟器并不能直接访问开发机器。这给调试工作增加了困难。而 Dev Tunnel 可以提供一个域名可以直接访问,而且调式仍然发生在本地。

文章推荐

1、HTTP Redirect 特殊处理 Authentication Header

在 ASP.NET Core 中,如果返回 301 redirect 这样的请求,那么后续的请求会将 Authentication 头部信息丢失,这是因为 HTTP 协议的规范。

2、Polly 库中 Chaos Engineering

image

Polly 8.0 版本引入了 Chaos Engineering 功能,它能够主动引入 Fault 的机制,这样要求我们的应用程序能够主动进行 Resilience 相关的操作。它主要包含四种类型的策略

  • Fault: 引入异常
  • Outcome: 插入假的输出
  • Latency: 增加延迟
  • Behavior: 开启额外行为

在 HttpClient 中示例

  1. 创建 HttpClient
var httpClientBuilder = builder.Services.AddHttpClient<TodosClient>
(client => client.BaseAddress = new Uri("https://jsonplaceholder.typicode.com"));
  1. 引入 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 请求,依赖可能是数据库,文件系统访问等等。我们可以借助两个库完成上述的的要求

  1. 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");
    }
}
  1. TestContainer

这个库帮助我们运行一个 Container,然后将我们的外部依赖,比如数据库给运行起来,这样就能在测试的时候直接连接该数据库。

PostgreSqlContainer _dbContainer = new PostgreSqlBuilder()
.WithImage("Postgres:latest")
.WithDatatabase("runtrack")
.WithUserName("User")
.WithPassword("password")
.Build()

这样就能获得一个 Postgre 数据库,在我们 WebApplicationFactory 构造 WebHost 的时候,将它作为数据库的来源。

4、TerminalLogger

.NET 8 Build 引入了新的日志输出框架: TerminalLogger, 相对于其他默认的日志输出有如下的优势

  1. Warning 和 Error 安装目前框架分组
  2. 通过颜色让输出更加容易阅读
  3. 超链接到build 主要输出
  4. 展示每个 build target 耗时
  5. 编译最终结果更加清晰
  • 默认日志输出

image

  • TerminalLogger 输出

image

5、C# 11 中检查集合空

image

在 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

image

Coravel 是 .NET 生态中用来实现定时任务的库,不同 Hangfire 或者 Quartz,它支持异步和依赖注入编程方式,而且支持 Fluent 编程方式,在 ASP.NET Core 中的实例

builder.Services.AddScheduler();
app.Services.UseScheduler(scheduler =>
{
    scheduler.Schedule(() =>
    {
        Console.WriteLine("Every second.");
    })
    .EverySecond();
});

2、EF Core SQL debug 插件

image

Visual Studio 一款插件,可以展示 EF Core 查询语句的执行计划,这个对查询优化工作非常有帮助。