如何与相互依赖的客户打交道?

时间:2019-02-09 09:05:29

标签: c# dependency-injection direct-line-botframework

基于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);
    }
}

0 个答案:

没有答案