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()
{
// Arrange
var calculator = new CalculatorService();
int a = 2;
int b = 3;
// Act
int result = calculator.Add(a, b);
// Assert
Assert.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();