5

I have a custom attribute that gets 2 parameters, how can I inject this parameters to MyAttribute ?

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


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

controller:

[MyAttribute()]
[Route("/action")]
public IActionResult Action()
{
   retuen View();
}
mohammad
  • 339
  • 1
  • 3
  • 10
  • 3
    you can search for `ServiceFilterAttribute` and `TypeFilterAttribute`, actually a custom `IFilterFactory` can be used as well. – King King Jan 31 '21 at 16:08
  • 2
    This article is pretty great and covers most of the relevant options: https://www.devtrends.co.uk/blog/dependency-injection-in-action-filters-in-asp.net-core – SBFrancies Jan 31 '21 at 16:09
  • 1
    @mohammad please check https://stackoverflow.com/questions/4102138/how-to-use-dependency-injection-with-an-attribute – Nayan Jan 31 '21 at 17:46
  • According to mentioned link, don't inject in a attribute, please check https://stackoverflow.com/questions/29915192/dependency-injection-in-attributes – Saeed Aghdam Jan 31 '21 at 19:58

1 Answers1

4

Firstly,you need inject IHttpContextAccessor instead of HttpContextAccessor.

Secondly,service is not a valid attribute parameter type.I suggest that you could use ActionFilterAttribute or any other Attribute(It depends on your detailed scenario) which could cast to ServiceFilterAttribute or TypeFilterAttribute.

Here is a whole working demo:

Custom ActionFilterAttribute:

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


    public MyAttribute(IHttpContextAccessor accessor, IUserService userService)
    {
        _accessor = accessor;
        _userService = userService;
    }
}

Controller:

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

Register services:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpContextAccessor();
    services.AddScoped<IUserService, UserService>();
    services.AddScoped<MyAttribute>();          
}

Reference:

get values from class and method attribute in middleware in asp.net core

Rena
  • 30,832
  • 6
  • 37
  • 72