Skip to content

Latest commit

 

History

History
157 lines (104 loc) · 6.66 KB

episode-037.md

File metadata and controls

157 lines (104 loc) · 6.66 KB

.NET 每周分享第 37 期

卷首语

VS Code C# 官方插件

image

之前 VS Code 中的 C# 支持都是由 OmniSharp 提供的。但是官方并没有明确的 C# 支持,现在 C# Dev Kit 插件弥补了这个缺失。 安装完成后,你可与在 VS code 中体验 VS 开发的感觉:

  1. 创建项目

image

  1. 解决方案视图

image

  1. 运行单测

image

  1. Debug

image

注意,这个插件不是开源免费的,商业使用需要购买许可证。

行业资讯

1、CLI 版的 Upgrade Assistant

image

.NET Upgrade Assistant.NET应用程序的升级工具,比如从.NET Framework迁移到.NET, 或者不同的 .NET版本升级,之前这个是作为Visual Studio的一个插件,现在提供了CLI 版本。

文章推荐

1、动态构建查询表达式

image

C# LINQ 中,除了我们显式地写查询语句,比如 persons.Where(p => p.FirstName == "feng") 之外,我们还可以通过 Experssion 的方式动态构建查询语句。这样查询就可以在动态运行时执行,达到数据驱动的的目的,比如

static Expression<Func<Person, bool>> CreateEqualExpression(string propertyName, object value)
{
    var param = Expression.Parameter(typeof(Person), "p");

    var member = Expression.Property(param, propertyName);

    var constant = Expression.Constant(value);

    var body = Expression.Equal(member, constant);

    return Expression.Lambda<Func<Person, bool>>(body, param);
}

var expression = CreateEqualExpression("FirstName", "feng");
persion.Where(expression);

2、ASP.NET Core 应用程序部署到 Linux Nginx 中

image

这篇文章介绍了如何将一个 ASP.NET Core 的应用程序部署到 Linux 中,并且使用 Nginx 作为反向代理

3、ASP.NET Core 健康检查

image

ASP.NET Core 应用程序中,我们需要检查服务的健康状态,比如 database, 外部依赖服务等等。ASP.NET Core 提供了 HealthCheck 的组件,可以帮助我们完成这样工作。

// 实现
public class DatabaseHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        try
        {
            string connectionString = "Server=localhost,1433;database=TestDb;User Id=SA;Password=xxxxxx";
            using var connection = new SqlConnection(connectionString);
            connection.Open();
            var command = connection.CreateCommand();
            command.CommandText = "Select 1";
            command.ExecuteScalar();
            return Task.FromResult(HealthCheckResult.Healthy());
        }
        catch (Exception e)
        {
            return Task.FromResult(HealthCheckResult.Unhealthy());
        }
    }
}
// 注册服务
builder.Services.AddHealthChecks()
    .AddCheck<DatabaseHealthCheck>("database");

// 定义路由
app.MapHealthChecks("/_health", new Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions
{
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

4、.NET StringComparer 优化

下面两个 Dictionary<string, string> 对象

var dict1 = new Dictionary<string, string>();
var dict2 = new Dictionary<string, string>(StringComparer.Ordinal);

它们在 .NET framework.NET Core 中性能表现是不一样的,也就是说,在 .NET Coredict1 的性能比 dict2 好。这是为什么呢?在这个 Github issue 中解释说,在 dict2 中使用的是 EqualityComparer<string>.Default, 它其实并不是 StringComparer.Ordinal 类型,它避免了随机哈希操作直到必要的时候。

5、使用连接池优化性能

image

这是微软工程师帮助科技工程从 on-premcloud 转型过程中,遇到了并发性的问题,通过连接池 connection pool 技术,解决了客户的问题

builder.setKeepAliveStrategy((response, context) -> {
String header = response.getFirstHeader("Keep-Alive").getValue();
if (header == null) {
header = response.getFirstHeader("Connection").getValue();
}
if (header != null && header.equalsIgnoreCase("keep-alive")) {
return 30 * 1000; // keep the connection alive for 30 seconds
}
return -1; // close the connection otherwise
});

6、.NET Native AOT

image

这是 .NET Native AOT 介绍的网站,作者在这里会分享 Native AOT 细节。

开源项目

1、.NET roadmap 查询

image

这是一个非常有意思的项目,它收集了 .NET 的运行时库,工具以及其他的基础设施中的 issue,Task 和 Milestone 以方便查询。

2、serilog

image

Serilog 是 .NET 社区著名地日志库,相对于 Microsoft.Extensions.Logging , 它是一个结构化日志输出库。