Простой инжектор для инъекций в PageModel ASP.NET Core Razor Pages - PullRequest
0 голосов
/ 27 апреля 2018

Простой инжектор ( SI ) Документация здесь показывает, как интегрировать SI с ядром ASP.NET:

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);
}

Этот пример кода показывает, как интегрировать SI с контроллерами и ViewComponents (модель MVC ), с которыми мы работали до Razor Pages .

Однако эта функция не интегрирует SI в Razor Pages , новую функцию, выпущенную в ASP.NET Core 2.0. В основном это модель MVVM (не совсем).

Таким образом, страницы Razor имеют по одному PageModel для каждого представления, и это похоже на контроллер. И я хотел бы добавить в конструктор этого класса, используя SI.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Simple Injector предлагает простой способ достичь этого с помощью метода расширения 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();
});

Чтобы увидеть весь пример https://simpleinjector.readthedocs.io/en/latest/aspnetintegration.html

0 голосов
/ 27 апреля 2018

Я придумал, как ввести в конструктор 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;
}

А затем просто добавьте эту новую регистрацию синглтона:

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);
}

То, что он делает, это в основном вызов Container.GetInstance(instanceType) всякий раз, когда создается PageModel.

...