基于this argument,我正在实现用于处理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);
}
}