简单的喷油器注入到PageModel ASP.NET Core Razor页面中



简单的喷油器( si (文档在这里显示如何与ASP.NET Core集成 si

private void IntegrateSimpleInjector(IServiceCollection services) {
    container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddSingleton<IControllerActivator>(
        new SimpleInjectorControllerActivator(container));
    services.AddSingleton<IViewComponentActivator>(
        new SimpleInjectorViewComponentActivator(container));
    services.EnableSimpleInjectorCrossWiring(container);
    services.UseSimpleInjectorAspNetRequestScoping(container);
}

此示例代码显示了如何与控制器和查看器( mvc 型号(集成 SI ,我们曾经在 razor pages 型>。

但是,此DOE不集成 si 纳入剃须页,这是使用ASP.NET Core 2.0发布的新功能。这基本上是MVVM模型(并非完全(。

因此,剃须刀页面对于每个视图都有一个PageModel,就像控制器一样。我想使用si。

我想出了一种使用简单注射器:

的注入PageModel约束的方法
public class SimpleInjectorPageModelActivatorProvider : IPageModelActivatorProvider
{
    private Container Container { get; }
    public SimpleInjectorPageModelActivatorProvider(Container c) => Container = c;
    public Func<PageContext, object> CreateActivator(CompiledPageActionDescriptor d) =>
        _ => Container.GetInstance(d.ModelTypeInfo.AsType());
    public Action<PageContext, object> CreateReleaser(CompiledPageActionDescriptor d) =>
        null;
}

然后,只需添加此新的Singleton注册:

private void IntegrateSimpleInjector(IServiceCollection services)
{
    container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddSingleton<IControllerActivator>(
        new SimpleInjectorControllerActivator(container));
    services.AddSingleton<IViewComponentActivator>(
        new SimpleInjectorViewComponentActivator(container));
    // Enables Injection into PageModel
    services.AddSingleton<IPageModelActivatorProvider>(
            new SimpleInjectorPageModelActivatorProvider(container));
    services.EnableSimpleInjectorCrossWiring(container);
    services.UseSimpleInjectorAspNetRequestScoping(container);
}

它的作用基本上是在创建PageModel时称为Container.GetInstance(instanceType)

简单的喷油器提供一种简单的方法来通过扩展方法 addpageModeLactivation

services.AddSimpleInjector(container, options =>
{
    // AddAspNetCore() wraps web requests in a Simple Injector scope.
    options.AddAspNetCore()
        // Ensure activation of a specific framework type to be created by
        // Simple Injector instead of the built-in configuration system.
        .AddControllerActivation()
        .AddViewComponentActivation()
        .AddPageModelActivation()
        .AddTagHelperActivation();
});

查看整个示例

最新更新