Исходя из этого аргумента , я реализую классы, которые будут обрабатывать обмен сообщениями между 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);
}
}