Как бороться с взаимозависимыми клиентами? - PullRequest
0 голосов
/ 09 февраля 2019

Исходя из этого аргумента , я реализую классы, которые будут обрабатывать обмен сообщениями между Discord и DirectLine API.

Тогда, однако, я не уверен, как добиться наилучшей практикиреализовать двух клиентов, которые будут взаимно зависеть от других.Я когда-либо слышал, что это означает, что дизайн - это что-то не так, когда у меня есть взаимозависимость.

В настоящее время у меня есть некоторый код (не вся функция), показанный ниже.Есть ли какие-либо предложения об этом испытании?

Startup.cs
Добавить синглетоны для DI.

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddSingleton<IDirectLineClient, DirectLineClient>();
        services.AddSingleton<IDiscordClient, DiscordClient>();
        ...
    }

DiscordClient.cs
Обработка сообщений от пользователей на Discord и передача их в DirectLine API.

namespace Microsoft.Chive
{
    public interface IDiscordClient
    {
        Task RespondMessage(SocketMessage socketMessage);
    }
    public class DiscordClient : IDiscordClient
    {
        private DiscordSocketClient _client;
        private IServiceProvider _provider;
        private CommandService _commands;
        private static string _secret;
        private static IDirectLineClient _directLineClient;

        public DiscordClient(IDirectLineClient directLineClient, IConfiguration Configuration, IServiceProvider provider)
        {
            _provider = provider;
            _directLineClient = directLineClient;
            _secret = Configuration.GetSection("discordClientSecret")?.Value;
        }

        public static Task<DiscordClient> InitializeAsync(IDirectLineClient directLineClient, IConfiguration configuration, IServiceProvider provider)
        {
            var instance = new DiscordClient(directLineClient, configuration, provider);
            return instance.InitializeInstance();
        }

        private async Task<DiscordClient> InitializeInstance()
        {
            _client = new DiscordSocketClient();
            _client.MessageReceived += OnMessageReceive;
            _commands = new CommandService();

            await _client.LoginAsync(TokenType.Bot, _secret);
            await _client.StartAsync();
            await Task.Delay(-1);
            return this;
        }


        private async Task OnMessageReceive(SocketMessage socketMessage)
        {
            var message = socketMessage as SocketUserMessage;
            await _directLineClient.PostMessageAsync(message.Content);
        }


        public async Task RespondMessage(SocketMessage socketMessage)
        {
            var message = socketMessage as SocketUserMessage;
            var context = new CommandContext(_client, message);

            await _commands.ExecuteAsync(context, 0, _provider);
        }
    }
}

DirectLineClient.cs
Передача ответа от DirectLine API на Discord Client.

public interface IDirectLineClient
{
    Task PostMessageAsync(string message);
}

public class DirectLineClient : IDirectLineClient
{
    private static string _secret;
    private static string _handle;
    private Microsoft.Bot.Connector.DirectLine.DirectLineClient _client;
    private Conversation _conversation;
    private IDiscordClient _discordClient;

    public DirectLineClient(IDiscordClient discordClient, IConfiguration configuration)
    {
        this._discordClient = discordClient;
        _handle = configuration.GetSection("directLineHandle")?.Value;
        _secret = configuration.GetSection("directLineSecret")?.Value;
    }

    public static Task<DirectLineClient> InitializeAsync(IDiscordClient discordClient, IConfiguration configuration)
    {
        var instance = new DirectLineClient(discordClient, configuration);
        return instance.InitializeInstance();
    }

    private async Task<DirectLineClient> InitializeInstance()
    {
        _client = new Microsoft.Bot.Connector.DirectLine.DirectLineClient(_secret);
        return this;
    }

    public async Task StartConversation()
    {
        _conversation = await _client.Conversations.StartConversationAsync();
    }

    public async Task PostMessageAsync(string message)
    {
        var activity = new Activity
        {
            From = new ChannelAccount("user"),
            Text = message,
            Type = ActivityTypes.Message
        };
        await _client.Conversations.PostActivityAsync(_conversation.ConversationId, activity);
    }

    public async Task OnResponseReceive(SocketMessage socketMessage)
    {
        await _discordClient.RespondMessage(socketMessage);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...