[英]Dependency Injection in IAuthorizationFilter ASP.Net Core 3
[英]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.