DiscordBot:Не удается разрешить службу для типа «Discord».Веб-сокет.DiscordSocketClient» при попытке активировать » блокировщик.Услуги.Командный манипулятор

#c# #discord.net

Вопрос:

Я пытаюсь сделать бота для раздора на Discord.net в первый раз.

Вот мой код.

    class StartUp
{
    public IConfigurationRoot Configuration { get; }

    public StartUp(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(AppContext.BaseDirectory)
            .AddYamlFile("_config.yml");
        Configuration = builder.Build();
    }
    public static async Task RunAsync(string[] args)
    {
        var startup = new StartUp(args);
        await startup.RunAsync(); 
    }

    public async Task RunAsync()
    {
        var services = new ServiceCollection();
        ConfigureServices(services);

        var provider = services.BuildServiceProvider();
        provider.GetRequiredService<CommandHandler>();

        await provider.GetRequiredService<StartUpService>().StartAsync();
        await Task.Delay(-1);
    }
    private void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(new DiscordShardedClient(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);
    }
}
 

}

проблема в строке provider.GetRequiredService<CommandHandler>();

Код манипулятора команд

 class CommandHandler
{
    public static IServiceProvider _provider;
    public static DiscordSocketClient _discord;
    public static CommandService commands;
    public static IConfigurationRoot _config;

    public CommandHandler(DiscordSocketClient 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;
    }
}
 

Вывод: «Не удалось разрешить службу для типа «Разногласия».Веб-сокет.DiscordSocketClient» при попытке активировать » блокировщик.Услуги.Командир».
Я понятия не имею, как это решить, спасибо сразу.

Ответ №1:

В CommandHandler тебя впрыскивают DiscordSocketClient , но в ConfigureServices тебя регистрируют DiscordShardedClient .

Вам либо нужно:

  1. Зарегистрируйте a DiscordSocketClient , или
  2. Вколоть а DiscordShardedClient .

Если вы не уверены, какой из них использовать, здесь есть некоторая документация