Внедрение зависимостей не удалось с IAuthorizationFilter и Simple Injector для ASP. NET Core - PullRequest
0 голосов
/ 07 апреля 2020

Это очень похоже на это дело , но решение не работает для. net core 3.1.

Итак, у меня есть IAuthorizationFilter:

public class AuthFilter : IAuthorizationFilter
{
    private readonly IUserService userService;
    public AuthFilter(IUserService userService)
    {
        this.userService = userService;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        Console.WriteLine("Doing authZZZ: " + userService.DoSomething());
    }
}

и простой сервис

public interface IUserService
{
    string DoSomething();
}

class UserService : IUserService
{
    public string DoSomething()
    {
        return "Something";
    }
}

Регистрация фильтра и сервиса как:

services.Configure<MvcOptions>(options => options.Filters.Add<AuthFilter>());
...
container.Register<IUserService, UserService>(Lifestyle.Transient);

Все остальное, как в примере

И получено исключение при вызове действия:

InvalidOperationException: невозможно разрешить службу для типа 'TestSimpleInj.IUserService' при попытке активировать 'TestSimpleInj.AuthFilter'.

Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
lambda_method(Closure , IServiceProvider , object[] )
Microsoft.AspNetCore.Mvc.TypeFilterAttribute.CreateInstance(IServiceProvider serviceProvider)
Microsoft.AspNetCore.Mvc.Filters.DefaultFilterProvider.ProvideFilter(FilterProviderContext context, FilterItem filterItem)
Microsoft.AspNetCore.Mvc.Filters.DefaultFilterProvider.OnProvidersExecuting(FilterProviderContext context)
Microsoft.AspNetCore.Mvc.Filters.FilterFactory.CreateUncachedFiltersCore(IFilterProvider[] filterProviders, ActionContext actionContext, List<FilterItem> filterItems)
Microsoft.AspNetCore.Mvc.Filters.FilterFactory.GetAllFilters(IFilterProvider[] filterProviders, ActionContext actionContext)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvokerCache.GetCachedResult(ControllerContext controllerContext)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvokerProvider.OnProvidersExecuting(ActionInvokerProviderContext context)
Microsoft.AspNetCore.Mvc.Infrastructure.ActionInvokerFactory.CreateInvoker(ActionContext actionContext)
Microsoft.AspNetCore.Mvc.Routing.ActionEndpointFactory+<>c__DisplayClass7_0.<CreateRequestDelegate>b__0(HttpContext context)
Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

1 Ответ

2 голосов
/ 07 апреля 2020

Ответ на ваш вопрос на самом деле почти дается в q & a , на который вы ссылались, но вам просто нужно несколько небольших настроек, чтобы он работал под ASP. NET Core MVC.

Вам нужно изменить AuthorizationFilterProxy<TFilter> на следующее:

public class AuthorizationFilterProxy<TFilter> : IAuthorizationFilter
    where TFilter : class, IAuthorizationFilter
{
    private readonly Container Container;

    public AuthorizationFilterProxy(Container container)
    {
        Container = container;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        this.Container.GetInstance<TFilter>().OnAuthorization(context);
    }
}

Теперь вам нужно подключить AuthorizationFilterProxy<TFilter> к ASP. NET Core MVC. pipe, что можно сделать следующим образом:

services.Configure<MvcOptions>(options => options.Filters.Add(
    new AuthorizationFilterProxy<AuthFilter>(container)));

container.Register<AuthFilter>();

Это также очень похоже на добавление глобального фильтра к ASP. NET MVC, как показано в указанном вопросе.

Это добавит AuthorizationFilterProxy<AuthFilter> к списку MVC Фильтров, и прокси перенаправит вызов на Simple Injector. AuthFilter теперь разрешен из Simple Injector, и вместе с ним его IUserService зависимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...