如何在ASP.NET Core Razor Pages中集成Simple Injector?附示例代码
在ASP.NET Core Razor Pages的PageModel中注入Simple Injector的实现方案
我来帮你搞定在ASP.NET Core Razor Pages的PageModel里注入Simple Injector的问题,结合官方的集成思路,咱们一步步来:
首先,官方给出的集成代码只覆盖了Controller和ViewComponent的激活器,而Razor Pages的PageModel需要专门的激活器支持。咱们需要扩展官方的IntegrateSimpleInjector方法,添加PageModel相关的配置:
private void IntegrateSimpleInjector(IServiceCollection services) { // 设置Simple Injector的默认作用域为异步作用域,适配ASP.NET Core请求生命周期 container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle(); // 注册HttpContextAccessor,Simple Injector需要它关联请求上下文与作用域 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // 注册Controller激活器(官方原有代码) services.AddSingleton<IControllerActivator>( new SimpleInjectorControllerActivator(container)); // 注册ViewComponent激活器(官方原有代码) services.AddSingleton<IViewComponentActivator>( new SimpleInjectorViewComponentActivator(container)); // 关键补充:注册PageModel的激活器提供者 // 这一步告诉ASP.NET Core用Simple Injector来创建PageModel实例 services.AddSingleton<IPageModelActivatorProvider>( new SimpleInjectorPageModelActivatorProvider(container)); // 启用跨 wiring,让Simple Injector能访问ASP.NET Core内置服务 services.EnableSimpleInjectorCrossWiring(container); // 将Simple Injector的作用域与ASP.NET Core请求生命周期绑定 services.UseSimpleInjectorAspNetRequestScoping(container); }
关键部分解释
- AsyncScopedLifestyle:匹配ASP.NET Core的异步请求生命周期,确保作用域服务在请求结束时正确释放。
- IPageModelActivatorProvider:这是官方代码里缺失的核心配置,没有它,ASP.NET Core会用默认方式创建PageModel,Simple Injector的依赖注入就不会生效。
- 跨 wiring 与请求作用域绑定:这两个方法确保Simple Injector和ASP.NET Core的服务体系能协同工作,既可以使用自定义服务,也能访问框架内置服务。
在Program.cs中完成整合(.NET 6+示例)
接下来在启动类里把这些配置串起来,同时注册你的业务服务:
var builder = WebApplication.CreateBuilder(args); // 初始化Simple Injector容器 var container = new Container(); // 添加Razor Pages和MVC服务(如果需要的话) builder.Services.AddRazorPages(); builder.Services.AddControllersWithViews(); // 调用整合方法配置Simple Injector与ASP.NET Core的集成 IntegrateSimpleInjector(builder.Services); // 注册你的自定义服务到Simple Injector容器 // 示例:注册一个作用域服务 container.Register<IOrderService, OrderService>(Lifestyle.Scoped); // 更多服务注册... // 验证容器配置,提前发现依赖缺失等问题 container.Verify(); var app = builder.Build(); // 配置中间件管道 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); // 映射Razor Pages路由 app.MapRazorPages(); app.Run();
最后验证
现在你的PageModel就可以通过构造函数接收Simple Injector注册的服务了,比如:
public class IndexModel : PageModel { private readonly IOrderService _orderService; // Simple Injector会自动注入IOrderService实例 public IndexModel(IOrderService orderService) { _orderService = orderService; } public void OnGet() { // 使用注入的服务 var orders = _orderService.GetRecentOrders(); // ... } }
内容的提问来源于stack exchange,提问作者Rodrigo Riskalla Leal
相关产品推荐
相关产品推荐

