You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:10:15