简体   繁体   English

依赖注入失败,IAuthorizationFilter 和 ASP.NET 核心的简单注入器

[英]Dependency injection failed with IAuthorizationFilter and Simple Injector for ASP.NET Core

This is very similar to this case , but solution not works for .net core 3.1.这与这种情况非常相似,但解决方案不适用于 .net 核心 3.1。

So, I have IAuthorizationFilter :所以,我有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());
    }
}

and simple service和简单的服务

public interface IUserService
{
    string DoSomething();
}

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

Registering filter and service as:将过滤器和服务注册为:

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

Everything else, as in example其他一切,如示例

And got exception while calling action:并在调用动作时出现异常:

InvalidOperationException: Unable to resolve service for type 'TestSimpleInj.IUserService' while attempting to activate 'TestSimpleInj.AuthFilter'. InvalidOperationException:尝试激活“TestSimpleInj.AuthFilter”时无法解析“TestSimpleInj.IUserService”类型的服务。

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)

The answer to your question is actually almost given in the q&a you referred to, but you just need a few minor tweaks to get it working under ASP.NET Core MVC.您的问题的答案实际上几乎在您提到的问答中给出,但是您只需要进行一些小的调整即可使其在ASP.NET Core MVC 下工作。

You need to change the AuthorizationFilterProxy<TFilter> to the following:您需要将AuthorizationFilterProxy<TFilter>更改为以下内容:

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

    public AuthorizationFilterProxy(Container container) =>
        this.Container = container;

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

Now you need to hook this AuthorizationFilterProxy<TFilter> into ASP.NET Core MVC's pipeline, which can be done as follows:现在你需要将这个AuthorizationFilterProxy<TFilter>挂接到 ASP.NET Core MVC 的管道中,可以如下操作:

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

container.Register<AuthFilter>();

This, as well, is very similar to adding a global filter to ASP.NET MVC, as shown in the referenced question.这也非常类似于向 ASP.NET MVC 添加全局过滤器,如参考问题所示。

This adds the AuthorizationFilterProxy<AuthFilter> to the list of MVC Filters and the proxy will forward the call to Simple Injector.这会将AuthorizationFilterProxy<AuthFilter>添加到 MVC 过滤器列表中,并且代理会将调用转发给 Simple Injector。 AuthFilter is now resolved from Simple Injector, and with it its IUserService dependency. AuthFilter现在从 Simple Injector 解析,并与它的IUserService依赖关系。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM