1. 依賴注入(Dependency Injection)
- 技術知識:依賴注入是一種設計模式,它允許將對象的依賴關系從對象本身中分離出來,通過構造函數、屬性或方法參數等方式注入到對象中。這樣可以提高代碼的可測試性、可維護性和可擴展性。
- 案例:在一個簡單的后臺管理系統中,有一個用戶服務接口?
IUserService
?和其實現類?UserService
。通過依賴注入,我們可以將?UserService
?注入到控制器中。dotnet-core-dependency-injection.NET Core 依賴注入示例
生成 Program.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;// 定義用戶服務接口
public interface IUserService
{string GetUserName();
}// 實現用戶服務接口
public class UserService : IUserService
{public string GetUserName(){return "John Doe";}
}// 定義用戶控制器
public class UserController
{private readonly IUserService _userService;public UserController(IUserService userService){_userService = userService;}public string GetUser(){return _userService.GetUserName();}
}var builder = WebApplication.CreateBuilder(args);// 注冊服務
builder.Services.AddScoped<IUserService, UserService>();var app = builder.Build();app.Run(async context =>
{var serviceProvider = app.Services;var userController = serviceProvider.GetRequiredService<UserController>();var userName = userController.GetUser();await context.Response.WriteAsync($"User Name: {userName}");
});app.Run();
2. 中間件(Middleware)
- 技術知識:中間件是處理 HTTP 請求和響應的組件,它們按順序依次執行,可以對請求進行預處理,也可以對響應進行后處理。
- 案例:創建一個簡單的日志中間件,記錄每個請求的信息。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading.Tasks;// 定義日志中間件
public class LoggingMiddleware
{private readonly RequestDelegate _next;public LoggingMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(Microsoft.AspNetCore.Http.HttpContext context){Console.WriteLine($"Request received at {DateTime.Now}: {context.Request.Path}");await _next(context);Console.WriteLine($"Response sent at {DateTime.Now}");}
}var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();// 使用日志中間件
app.UseMiddleware<LoggingMiddleware>();app.Run(async context =>
{await context.Response.WriteAsync("Hello, World!");
});app.Run();
3. 路由(Routing)
- 技術知識:路由是將 HTTP 請求映射到相應的處理程序(如控制器的動作方法)的過程。
- 案例:創建一個簡單的控制器,并使用路由來處理不同的請求。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;// 定義控制器
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{[HttpGet]public IActionResult Get(){return Ok("This is a weather forecast.");}
}var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();var app = builder.Build();app.UseRouting();app.UseEndpoints(endpoints =>
{endpoints.MapControllers();
});app.Run();
4. 實體框架核心(Entity Framework Core)
- 技術知識:Entity Framework Core 是一個跨平臺的對象關系映射(ORM)框架,它允許開發人員使用面向對象的方式操作數據庫。
- 案例:創建一個簡單的數據庫上下文和實體類,并進行數據的增刪改查操作。
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;// 定義實體類
public class Blog
{public int BlogId { get; set; }public string Url { get; set; }public List<Post> Posts { get; } = new List<Post>();
}public class Post
{public int PostId { get; set; }public string Title { get; set; }public string Content { get; set; }public int BlogId { get; set; }public Blog Blog { get; set; }
}// 定義數據庫上下文
public class BloggingContext : DbContext
{public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;");}
}class Program
{static void Main(){using (var db = new BloggingContext()){// 添加博客db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });var count = db.SaveChanges();Console.WriteLine("{0} records saved to database", count);// 查詢博客var blogs = db.Blogs.OrderBy(b => b.Url).ToList();foreach (var blog in blogs){Console.WriteLine("Blog: {0}", blog.Url);}}}
}
5. 認證和授權(Authentication and Authorization)
- 技術知識:認證是驗證用戶身份的過程,授權是確定用戶是否有權限訪問特定資源的過程。
- 案例:使用 JWT(JSON Web Token)進行認證和授權。
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using System.Text;var builder = WebApplication.CreateBuilder(args);// 添加 JWT 認證服務
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ValidateIssuerSigningKey = true,ValidIssuer = "YourIssuer",ValidAudience = "YourAudience",IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey"))};});// 添加授權服務
builder.Services.AddAuthorization(options =>
{options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
});builder.Services.AddControllers();var app = builder.Build();app.UseAuthentication();
app.UseAuthorization();app.MapControllers();app.Run();
6. 配置管理(Configuration Management)
-
技術知識:配置管理允許將應用程序的配置信息(如數據庫連接字符串、API 密鑰等)與代碼分離,方便在不同環境中進行配置。
-
案例:使用?
appsettings.json
?文件進行配置管理。
Program.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;var builder = WebApplication.CreateBuilder(args);// 讀取配置文件
var configuration = builder.Configuration;
var connectionString = configuration.GetConnectionString("DefaultConnection");// 可以使用 connectionString 進行數據庫連接等操作var app = builder.Build();app.Run(async context =>
{await context.Response.WriteAsync($"Connection String: {connectionString}");
});app.Run();
appsettings.json
{"ConnectionStrings": {"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*"
}
7. 日志記錄(Logging)
- 技術知識:日志記錄是記錄應用程序運行時信息的過程,有助于調試和監控應用程序。
- 案例:使用內置的日志記錄器記錄信息。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;var builder = WebApplication.CreateBuilder(args);// 添加日志服務
builder.Logging.AddConsole();var app = builder.Build();var logger = app.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("Application started.");app.Run(async context =>
{logger.LogInformation("Request received.");await context.Response.WriteAsync("Hello, World!");logger.LogInformation("Response sent.");
});app.Run();
8. 異步編程(Asynchronous Programming)
- 技術知識:異步編程允許應用程序在執行耗時操作(如數據庫查詢、網絡請求等)時不阻塞線程,提高應用程序的性能和響應能力。
- 案例:使用?
async
?和?await
?關鍵字進行異步數據庫查詢。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;var builder = WebApplication.CreateBuilder(args);// 添加日志服務
builder.Logging.AddConsole();var app = builder.Build();var logger = app.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("Application started.");app.Run(async context =>
{logger.LogInformation("Request received.");await context.Response.WriteAsync("Hello, World!");logger.LogInformation("Response sent.");
});app.Run();
9. 單元測試(Unit Testing)
- 技術知識:單元測試是對應用程序中的最小可測試單元(如方法、類等)進行測試的過程,有助于確保代碼的正確性和可維護性。
- 案例:使用?
xUnit
?框架對一個簡單的服務進行單元測試。
using Xunit;// 定義一個簡單的服務
public class CalculatorService
{public int Add(int a, int b){return a + b;}
}public class CalculatorServiceTests
{[Fact]public void Add_TwoNumbers_ReturnsSum(){// Arrangevar calculator = new CalculatorService();int a = 2;int b = 3;// Actint result = calculator.Add(a, b);// AssertAssert.Equal(5, result);}
}
10. Web API 開發
- 技術知識:Web API 是一種允許不同應用程序之間進行通信的接口,通常使用 HTTP 協議進行數據傳輸。
- 案例:創建一個簡單的 Web API 控制器,提供數據查詢和添加功能。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Collections.Generic;// 定義數據模型
public class Product
{public int Id { get; set; }public string Name { get; set; }
}// 定義控制器
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{private static List<Product> _products = new List<Product>();[HttpGet]public IActionResult Get(){return Ok(_products);}[HttpPost]public IActionResult Post([FromBody] Product product){_products.Add(product);return CreatedAtAction(nameof(Get), new { id = product.Id }, product);}
}var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();var app = builder.Build();app.UseRouting();app.UseEndpoints(endpoints =>
{endpoints.MapControllers();
});app.Run();