.NET开发基础知识11-20
11. 配置热更新
- 技术知识:在 .NET Core 中,配置文件(如
appsettings.json
)修改后,应用程序能自动加载新配置,无需重启应用,这提高了运维效率。
Program.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// 定义配置类
public class MyOptions
{
public string MySetting { get; set; }
}
var builder = WebApplication.CreateBuilder(args);
// 配置强类型选项
builder.Services.Configure<MyOptions>(builder.Configuration.GetSection("MyOptions"));
var app = builder.Build();
var options = app.Services.GetRequiredService<Microsoft.Extensions.Options.IOptions<MyOptions>>().Value;
System.Console.WriteLine($"MySetting value: {options.MySetting}");
app.Run();
appsettings.json
{
"MyOptions": {
"MySetting": "Hello, Options!"
}
}
12. 环境变量配置
- 技术知识:可通过环境变量为 .NET Core 应用提供配置,这在不同环境(开发、测试、生产)部署时很有用,能灵活调整应用配置。
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);
// 从环境变量加载配置
builder.Configuration.AddEnvironmentVariables();
var app = builder.Build();
var config = app.Services.GetRequiredService<IConfiguration>();
var myEnvSetting = config["MyEnvSetting"];
if (!string.IsNullOrEmpty(myEnvSetting))
{
Console.WriteLine($"Value from environment variable: {myEnvSetting}");
}
else
{
Console.WriteLine("Environment variable not set.");
}
app.Run();
13. 自定义服务生命周期
- 技术知识:在 .NET Core 里,可自定义服务的生命周期,像创建单例服务、作用域服务和瞬态服务,以满足不同的业务需求。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// 定义服务接口
public interface IMyService
{
void DoWork();
}
// 定义服务实现
public class MyService : IMyService
{
public void DoWork()
{
System.Console.WriteLine("Service is doing work.");
}
}
var builder = WebApplication.CreateBuilder(args);
// 注册单例服务
builder.Services.AddSingleton<IMyService, MyService>();
var app = builder.Build();
var service = app.Services.GetRequiredService<IMyService>();
service.DoWork();
app.Run();
14. 过滤器(Filter)
- 技术知识:过滤器能在请求处理管道的特定阶段执行代码,如授权过滤器、动作过滤器、异常过滤器等,可用于实现日志记录、权限验证等功能。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// 自定义动作过滤器
public class CustomActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
System.Console.WriteLine("Before action execution");
base.OnActionExecuting(context);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
System.Console.WriteLine("After action execution");
base.OnActionExecuted(context);
}
}
// 定义控制器
[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
[HttpGet]
[CustomActionFilter]
public IActionResult Get()
{
return Ok("Hello, World!");
}
}
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseRouting();
app.MapControllers();
app.Run();
15. 中间件顺序
- 技术知识:中间件的执行顺序对请求处理流程有重要影响,合理安排中间件顺序能确保应用按预期工作。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// 自定义动作过滤器
public class CustomActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
System.Console.WriteLine("Before action execution");
base.OnActionExecuting(context);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
System.Console.WriteLine("After action execution");
base.OnActionExecuted(context);
}
}
// 定义控制器
[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
[HttpGet]
[CustomActionFilter]
public IActionResult Get()
{
return Ok("Hello, World!");
}
}
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseRouting();
app.MapControllers();
app.Run();
16. 端点路由
- 技术知识:端点路由是 .NET Core 3.0 引入的新路由系统,提供更灵活、高效的路由配置方式,支持属性路由、约定路由等。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello from root!");
});
endpoints.MapGet("/about", async context =>
{
await context.Response.WriteAsync("This is the about page.");
});
});
app.Run();
17. 应用启动配置
- 技术知识:可在应用启动时进行各种配置,如设置日志级别、添加服务、配置中间件等,确保应用按需求启动。
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.ClearProviders();
builder.Logging.AddConsole();
// 添加服务
builder.Services.AddControllers();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.MapControllers();
app.Run();
18. 依赖注入作用域
- 技术知识:依赖注入作用域定义了服务实例的生命周期范围,如单例服务在整个应用生命周期内只有一个实例,作用域服务在每个请求周期内只有一个实例。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// 定义服务接口
public interface IMyScopedService
{
void DoWork();
}
// 定义服务实现
public class MyScopedService : IMyScopedService
{
public void DoWork()
{
System.Console.WriteLine("Scoped service is doing work.");
}
}
var builder = WebApplication.CreateBuilder(args);
// 注册作用域服务
builder.Services.AddScoped<IMyScopedService, MyScopedService>();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var scopedService = scope.ServiceProvider.GetRequiredService<IMyScopedService>();
scopedService.DoWork();
}
app.Run();
19. 配置强类型选项
-
技术知识:可将配置文件中的配置项映射到强类型类,便于在代码中使用,提高代码的可读性和可维护性。
Program.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// 定义配置类
public class MyOptions
{
public string MySetting { get; set; }
}
var builder = WebApplication.CreateBuilder(args);
// 配置强类型选项
builder.Services.Configure<MyOptions>(builder.Configuration.GetSection("MyOptions"));
var app = builder.Build();
var options = app.Services.GetRequiredService<Microsoft.Extensions.Options.IOptions<MyOptions>>().Value;
System.Console.WriteLine($"MySetting value: {options.MySetting}");
app.Run();
appsettings.json
{
"MyOptions": {
"MySetting": "Hello, Options!"
}
}
20. 应用程序生命周期事件
-
技术知识:.NET Core 应用有多个生命周期事件,如启动、停止等,可通过订阅这些事件执行特定代码,如资源清理、日志记录等。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var lifetime = app.Services.GetRequiredService<IHostApplicationLifetime>();
lifetime.ApplicationStarted.Register(() =>
{
Console.WriteLine("Application has started.");
});
lifetime.ApplicationStopping.Register(() =>
{
Console.WriteLine("Application is stopping.");
});
lifetime.ApplicationStopped.Register(() =>
{
Console.WriteLine("Application has stopped.");
});
app.Run();