Как использовать ASP.NET Core DI для разрешения зависимостей с помощью Simple Injector? - PullRequest
0 голосов
/ 10 июля 2019

В проекте ASP.NET Core web api я использую токены Simple Injector и JwtBearer. Я определил свой собственный класс обработчика событий токена и привязал его к механизму ASP.NET Core, как показано ниже:

private void ConfigureSecurity(IServiceCollection services)
{
    var encodedKey = Encoding.UTF8.GetBytes(_config[Konstants.SecretKey]);
    var key = new SymmetricSecurityKey(encodedKey);

    services.AddTransient<TokenAuthenticationEvents>();
    var authentication = services.AddAuthentication(o =>
    {
        o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        o.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
        o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    });

    authentication.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
    {
        options.SaveToken = true;
        options.EventsType = typeof(TokenAuthenticationEvents);
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = true,
            ValidAudience = _config[Konstants.AudienceKey],
            ValidateIssuer = true,
            ValidIssuer = _config[Konstants.AuthorityKey],
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = key,
            RequireExpirationTime = true,
            ValidateLifetime = true,
        };
    });
}

Вот мой класс токенов События:

public class TokenAuthenticationEvents : JwtBearerEvents
{
    private readonly ILogger _log;
    private readonly IUserManager _users;


    public TokenAuthenticationEvents(ILogger log)
    {
        _log = log ?? throw new ArgumentNullException(nameof(log));
        _users = null;
    }

    public override Task TokenValidated(TokenValidatedContext context)
    {
        //Some Custom Logic that requires IUserManager 

        return base.TokenValidated(context);
    }
}

Я использую Simple Injector в качестве моего DI-контейнера

services.AddSimpleInjector(container, options =>
{
    options
        .AddAspNetCore()
        .AddControllerActivation()
        .AddViewComponentActivation()
        .AddPageModelActivation()
        .AddTagHelperActivation();
    });
    services.EnableSimpleInjectorCrossWiring(container);
    services.UseSimpleInjectorAspNetRequestScoping(container);

IUserManager вместе со всеми его зависимостями зарегистрирован в Simple Injector. если я пытаюсь передать IUserManager в TokenAuthenticationEvents, возникает исключение, которое ASP.NET Core не может разрешить IUserManager. Итак, мой вопрос

Как мне указать ASP.NET Core DI получить разрешение IUserManager из Simple Injector? .

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Так же, как и простой инжектор перекрестные провода Компоненты ASP.NET Core, вы можете сделать то же самое и наоборот, хотя вам придется делать это вручную. Например:

services.AddScoped<IUserManager>(c => container.GetInstance<IUserManager>());
1 голос
/ 10 июля 2019

Этот ответ не решает вашу первоначальную проблему, но я заметил, что вы смешиваете старую модель конфигурации Simple Injector ASP.NET Core с новой. В настоящее время у вас есть следующий код:

services.AddSimpleInjector(container, options =>
{
    options
        .AddAspNetCore()
        .AddControllerActivation()
        .AddViewComponentActivation()
        .AddPageModelActivation()
        .AddTagHelperActivation();
    });
    services.EnableSimpleInjectorCrossWiring(container);
    services.UseSimpleInjectorAspNetRequestScoping(container);

Однако вызовы EnableSimpleInjectorCrossWiring и UseSimpleInjectorAspNetRequestScoping являются старыми API и будут удалены в следующем выпуске. Эти функции автоматически включаются при вызове .AddAspNetCore(). Таким образом, вы можете уменьшить свою конфигурацию до следующего:

services.AddSimpleInjector(container, options =>
{
    options
        .AddAspNetCore()
        .AddControllerActivation()
        .AddViewComponentActivation()
        .AddPageModelActivation()
        .AddTagHelperActivation();
    });
...