Github Copliot Chat
现在已经完全支持Visual Studio
。
在 .NET
项目中工程文件,比如 csproj
,其中的内容大家都非常熟悉,但是对于解决方案文件 sln
文件,大多数人都望而却步,因为其中的内容太复杂了。在 Visual Studio 新版的 preview 功能,可以选择 slnx
的格式,该格式中内容非常简单明了,
比如
<Solution>
<Project Path="RecordTypes.csproj" />
</Solution>
Microsoft 官方文档增加了一个新功能,当我们查看某一个类的时候,可以点击 Source
链接查看源码。
1、ASP.NET Core HttpClient 请求优化
HttpClient
是在 .NET
应用程序中广泛使用的类,它可以通过 HTTP 协议访问外部资源。其中在 ASP.NET Core
中可以更加优雅的方式使用他们。
- 使用 HttpClient 服务
首先将外部资源封装成一个服务,并且接受一个 HttpClient
对象
public class GitHubService
{
private readonly HttpClient _httpClient;
public GitHubService(HttpClient httpClient) {
_httpClient = httpClient;
}
public async Task<GithubFile[]?> GetFile(string org, string repo, string folder) {
//...
}
}
然后在依赖注入容器中注入该服务,并且配置相应的 HttpClient
基本信息
builder.Services.AddHttpClient<GitHubService>((sp, httpclient) =>
{
var setting = sp.GetRequiredService<IOptions<GithubSetting>>().Value;
httpclient.BaseAddress = new Uri(setting.BaseUrl);
});
- 使用 Refit
Refit 是一个 C# 的开源库,你只需要定义好配置访问资源的接口,该库可以生成相应的实现
public interface IGithubApi
{
[Get("/repos/{org}/{repo}/contents/{folder}")]
Task<GithubFile[]?> GetGithubFiles(string org, string repo, string folder);
}
这里 [Get("/repos/{org}/{repo}/contents/{folder}")]
注解是来自 Refit
的定义。然后将 IGithubApi
接口注入到容器中
builder.Services.AddRefitClient<IGithubApi>()
.ConfigureHttpClient((sp, httpclient) =>
{
var setting = sp.GetRequiredService<IOptions<GithubSetting>>().Value;
httpclient.BaseAddress = new Uri(setting.BaseUrl);
});
- 继承
DelegatingHandler
抽象类
如果 HttpRequest
还有其他配置信息,比如授权的什么,我们实现一个 DeletingHandler
类
public class GithubAuthHandler : DelegatingHandler
{
private readonly GithubSetting _githubSetting;
public GithubAuthHandler(IOptions<GithubSetting> options) {
_githubSetting = options.Value;
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
request.Headers.Add("Accept", _githubSetting.Accept);
request.Headers.Add("User-Agent", _githubSetting.UserAgent);
return base.SendAsync(request, cancellationToken);
}
}
然后在容器中配置该类
builder.Services.AddTransient<GithubAuthHandler>();
builder.Services.AddRefitClient<IGithubApi>()
.ConfigureHttpClient((sp, httpclient) =>
{
var setting = sp.GetRequiredService<IOptions<GithubSetting>>().Value;
httpclient.BaseAddress = new Uri(setting.BaseUrl);
}).AddHttpMessageHandler<GithubAuthHandler>();
从 Azure DevOps
迁移到 GitHub Action
的时候,测试报告是丢失的功能,所以这篇文章介绍如何在 GitHub Action
中生成.NET
应用程序包含测试结果的方法。
这本书介绍了 .NET
平台 Web 发展历史。
在 .NET
中有 double
和 decimal
类型,那么它们的区别是怎样的,这里有一个简单的例子
decimal decimalsum = 0m;
double doublesum = 0d;
for(int i = 0; i < 1000; i++)
{
decimalsum += 0.1m;
doublesum += 0.1d;
}
Console.WriteLine($"decimal sum: {decimalsum}");
Console.WriteLine($"decimal sum: {decimalsum}")
得到的输出结果如下:
decimal sum: 100.0
double sum: 99.9999999999986
5、异步高级功能
异步 await
是 C# 中特色,这个演讲中,作者分享了异步中的高级用法
- 使用
await
而不是Wait()
或者Result
- 使用
Fire and Forget
方式处理无结果任务 - 避免
return await
方法 - 使用
ConfigureAwait(false)
- 使用
ConfigureAwait(ConfigureAwaitOptions options)
方法 - 使用
ValueTask
- 对于流数据,使用
IAsyncEnumerable
- 使用
waitAsync(CancellationToken)
- 使用
IAsyncDisposable
.NET 8
是支持 container
中最大的一个版本,这篇文章详细介绍了其中的内容,包括
- 使用
dotnet publish
命令发布一个 container 镜像 - 为不同的 Linux 发行版本创建镜像
- 创建一个不同语言的镜像
- ...
JSON-Everything
是 .NET
下关于 JSON 处理的通用项目,比如 JSON
schema 的生成和校验, JSON Path 和其他功能。