我具有以下属性:
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));
}
}
下面的类具有使用该属性的方法。
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
}
}
现在,当我MultipleInteractivities
在Apply
方法上方使用as属性时,我会遇到问题。它希望我将参数传递给其构造函数。
现在,由于我已经注入IInteractivityService
了RecruitmentModule
类的构造函数。我尝试将其作为参数传递给我的MultipleInteractivities
属性。
像这样:
[Command("apply"), MultipleInteractivities(_interactivityService)]
但是,这产生以下错误:
在静态上下文中无法访问非静态字段“ _interactivityService”
因此,我尝试_interactivityService
在RecruitmentModule
此类中将字段设为静态:
private static IInteractivityService _interactivityService;
现在,当将它作为参数传递给MultipleInteractivities
属性时,出现以下错误。
属性构造函数参数“ interactivityService”的类型为“ DiscordBot.Core.Interfaces.IInteractivityService”,这不是有效的属性参数类型
我该如何IInteractivityService
传递给我MultipleInteractivitiesAttribute
而不会出错。
您不需要(也不应该)将依赖项注入到属性构造函数中。而是CommandContext
有一个Services
属性,该属性返回IServiceProvider
,您可以使用来解决依赖关系:
public class MultipleInteractivitiesAttribute : CheckBaseAttribute
{
public override Task<bool> ExecuteCheckAsync(CommandContext ctx, bool help)
{
var userId = ctx.User.Id;
var cmdName = ctx.Command.QualifiedName;
var interactivityService = ctx.Services.GetService<IInteractivityService>();
return Task.FromResult(!interactivityService.CheckForUserInteractivity(userId, cmdName));
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句