淺講.Net 6 並與之前版本寫法對比
阿新 • • 發佈:2021-11-11
介紹
昨天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()
我們來看一下之前的語法,我們有一大堆巢狀的 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 https://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的深入解析。
最後歡迎各位讀者關注我的部落格, https://github.com/MrChuJiu/Dppt/tree/master/src 歡迎大家Star
聯絡作者:加群:867095512 @MrChuJiu