簡體   English   中英

依賴注入失敗,IAuthorizationFilter 和 ASP.NET 核心的簡單注入器

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

這與這種情況非常相似,但解決方案不適用於 .net 核心 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.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)

您的問題的答案實際上幾乎在您提到的問答中給出,但是您只需要進行一些小的調整即可使其在ASP.NET Core MVC 下工作。

您需要將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);
}

現在你需要將這個AuthorizationFilterProxy<TFilter>掛接到 ASP.NET Core MVC 的管道中,可以如下操作:

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依賴關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM