I have the following attribute:
public class MultipleInteractivitiesAttribute : CheckBaseAttribute
{
private readonly IInteractivityService _interactivityService;
public MultipleInteractivitiesAttribute(IInteractivityService interactivityService)
{
_interactivityService = interactivityService;
}
public override Task<bool> ExecuteCheckAsync(CommandContext ctx, bool help)
{
var userId = ctx.User.Id;
var cmdName = ctx.Command.QualifiedName;
return Task.FromResult(!_interactivityService.CheckForUserInteractivity(userId, cmdName));
}
}
And the following class which has a method I use the attribute on.
public class RecruitmentModule : BaseCommandModule
{
private readonly IInteractivityService _interactivityService;
public RecruitmentModule(IInteractivityService interactivityService)
{
_interactivityService = interactivityService;
}
[Command("apply"), MultipleInteractivities()]
public async Task Apply(CommandContext ctx)
{
// some code here
}
}
Now I get a problem when I use the MultipleInteractivities as attribute above the Apply method. It expects me to pass an argument to its constructor.
Now since I already inject IInteractivityService in the constructor of the RecruitmentModule class. I try to pass it as an argument to my MultipleInteractivities attribute.
Like this:
[Command("apply"), MultipleInteractivities(_interactivityService)]
However, this gives the following error:
Cannot access non-static field '_interactivityService' in static context
So I try to make _interactivityService field static in the RecruitmentModule class like this:
private static IInteractivityService _interactivityService;
Now I get the following error when it is passed as an argument to my MultipleInteractivities attributes.
Attribute constructor parameter 'interactivityService' has type 'DiscordBot.Core.Interfaces.IInteractivityService', which is not a valid attribute parameter type
How can I get IInteractivityService passed to my MultipleInteractivitiesAttribute without getting errors.
You don't need to (and shouldn't) inject the dependency into the attribute constructor. Instead, the
CommandContexthas aServicesproperty returning anIServiceProviderthat you can use to resolve the dependency: