淺講.Net 6 並與之前版本寫法對比
介紹
昨天vs2022正式版已經推出了,估計很多人已經下載並開始創建.Net 6 開始嘗鮮了, 本節我簡要的給大家介紹一下.Net 6的一些改動。
正文
本次.Net6帶來最明顯的變化就是:
- 採用頂級語句,我們看不到
Program.Main()
了。 - 隱式 using 指令,隱式 using 指令意味著編譯器會根據項目類型自動添加一組 using 指令。
- 移除了Startup文件。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run();
對於這樣的改動大家可能會覺得這是C# 10 帶來的優化,但我的理解是.Net6為了新手更加方便入門,早期我們使用.Net Core 2/3/5 版本,還要給新人解釋系統啟動入口Program.Main()
以後不需要了,配置拆分成兩個文件Program.cs和Startup.cs雖然做到了關注點分離,但是對於新人會難以理解這次也沒了,當我們討論Startup的時候不用在去解釋如何調用的2個約定方法,即使它們沒有顯式實現介面,也可以調用它們。
我們來看一下之前的語法,我們有一大堆嵌套的 lambda,程式碼看上去非常複雜。
var hostBuilder = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddControllers();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Configure((ctx, app) =>
{
if (ctx.HostingEnvironment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", () => "Hello World!");
endpoints.MapRazorPages();
});
});
});
hostBuilder.Build().Run();
升級到.Net 6之後,我們可以使用更簡單的 API 來實現。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
對比
我們將 2個版本的語法對比來看
向DI 容器添加服務
var hostBuilder = Host.CreateDefaultBuilder(args);
hostBuilder.ConfigureServices(services =>
{
services.AddControllers();
services.AddSingleton<MyThingy>();
})
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddSingleton<MyThingy>();
日誌記錄
var hostBuilder = Host.CreateDefaultBuilder(args);
hostBuilder.ConfigureLogging(builder =>
{
builder.AddFile();
})
var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddFile();
Serilog 集成
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog() // <-- Add this line
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
builder.Host.UseSerilog();
完成的來看效果
public interface IHelloService
{
string Hello(bool isHappy);
}
public class HelloService : IHelloService
{
public string Hello(bool isHappy)
{
var hello = $"Hello World";
if (isHappy)
return $"{hello}, you seem to be happy today";
return hello;
}
}
using MinimalApiDemo;
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IHelloService, HelloService>();
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at //aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.MapGet("/Hello", (bool? isHappy, IHelloService service) =>
{
if (isHappy is null)
return Results.BadRequest("Please tell if you are happy or not :-)");
return Results.Ok(service.Hello((bool)isHappy));
});
app.Run();
結語
效果我就不貼圖了大家自己去實驗一下吧,後面看情況如果有時間我會給大家更一篇WebApplication和WebApplicationBuilder的深入解析。
最後歡迎各位讀者關注我的部落格, //github.com/MrChuJiu/Dppt/tree/master/src 歡迎大家Star
聯繫作者:加群:867095512 @MrChuJiu