自定义属性中的依赖注入

moh*_*mad 5 c# asp.net-core

我有一个获取 2 个参数的自定义属性,如何将此参数注入MyAttribute

public class MyAttribute : Attribute
{
    private readonly HttpContextAccessor _accessor;
    private readonly IUserService _userService;


    public MyAttribute(HttpContextAccessor accessor, IUserService userService)
    {
        _accessor = accessor; 
        _userService = userService;
        // ...
    }
}

Run Code Online (Sandbox Code Playgroud)

控制器:

[MyAttribute()]
[Route("/action")]
public IActionResult Action()
{
   retuen View();
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ena 5

首先,您需要注入IHttpContextAccessor而不是HttpContextAccessor.

其次,service 不是有效的属性参数类型。我建议您可以使用ActionFilterAttributeor 任何其他可以转换为orAttribute的(这取决于您的详细场景)。ServiceFilterAttributeTypeFilterAttribute

这是一个完整的工作演示:

自定义操作过滤器属性:

public class MyAttribute : ActionFilterAttribute
{
    private readonly IHttpContextAccessor _accessor;
    private readonly IUserService _userService;


    public MyAttribute(IHttpContextAccessor accessor, IUserService userService)
    {
        _accessor = accessor;
        _userService = userService;
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

//[ServiceFilter(typeof(MyAttribute))]
[TypeFilter(typeof(MyAttribute))]
public async Task<IActionResult> Index()
{          
    return View();
}
Run Code Online (Sandbox Code Playgroud)

注册服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    services.AddScoped<IUserService, UserService>();
    services.AddScoped<MyAttribute>();          
}
Run Code Online (Sandbox Code Playgroud)

参考:

从asp.net core中间件中的类和方法属性获取值