Discord.Net开发机器人提示无法解析DiscordSocketClient服务报错如何解决
问题根源
你遇到的报错是依赖注入类型不匹配导致的:
在Startup的ConfigureServices方法中,你向DI容器注册的客户端实例是DiscordShardedClient类型,而CommandHandler的构造函数要求注入的参数是DiscordSocketClient类型,两者不属于同一类型,因此DI容器在尝试实例化CommandHandler时找不到对应的服务实现,触发解析失败异常。
解决方案
你可以根据自己的使用场景二选一修改:
方案1:保留分片客户端,修改CommandHandler的依赖类型
如果你的机器人服务群数量较多,确实需要使用分片客户端DiscordShardedClient,只需要修改CommandHandler的字段和构造函数参数类型即可:
class CommandHandler { public static IServiceProvider _provider; // 字段类型修改为DiscordShardedClient public static DiscordShardedClient _discord; public static CommandService commands; public static IConfigurationRoot _config; // 构造函数第一个参数类型修改为DiscordShardedClient public CommandHandler(DiscordShardedClient discord, CommandService command, IConfigurationRoot conf, IServiceProvider provider) { _provider = provider; _config = conf; _discord = discord; commands = command; _discord.Ready += OnReady; } private Task OnReady() { Console.WriteLine($"been connected as user {_discord.CurrentUser.Username}#{_discord.CurrentUser.Discriminator}"); return Task.CompletedTask; } }
注意:DiscordShardedClient的Ready事件会在每个分片启动时各触发一次,如果需要所有分片完全就绪后再执行逻辑,可以在OnReady方法中增加分片数量校验。
方案2:使用普通单分片客户端,修改Startup的注册类型
如果你的机器人服务群数量较少,不需要分片功能,只需要修改Startup中注册的客户端类型即可:
private void ConfigureServices(IServiceCollection services) { // 将DiscordShardedClient改为DiscordSocketClient services.AddSingleton(new DiscordSocketClient(new DiscordSocketConfig { LogLevel = LogSeverity.Verbose, MessageCacheSize = 1000 })) .AddSingleton(new CommandService(new CommandServiceConfig { LogLevel = Discord.LogSeverity.Verbose, DefaultRunMode = RunMode.Async, CaseSensitiveCommands = false })) .AddSingleton<CommandHandler>() .AddSingleton<StartUpService>() .AddSingleton(Configuration); }
内容的提问来源于stack exchange,提问作者RokweMICHAEL
相关产品推荐
相关产品推荐

