IBotToUser实现从活动日志记录停止

时间:2018-01-09 14:36:29

标签: c# botframework

我们实施了 IBotToUser 界面来处理机器人发送给用户的消息的翻译,并将其注册如下。翻译工作正常但由于某种原因,机器人响应未记录在表存储中。

 Builder.RegisterType<InterceptBotToUser>().AsSelf().InstancePerLifetimeScope();
 Builder.Register(c => new InterceptBotToUserTranslator(c.Resolve<InterceptBotToUser>()))
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();

我们正在寻找翻译和活动历史。只要我们注册类来执行转换,bot到用户消息就不会存储在活动表中。如果我们禁用翻译(即DI注册),则在活动表中记录机器人到用户的消息。

public sealed class InterceptBotToUser : IBotToUser
{
    private readonly IMessageActivity toBot;
    private readonly IConnectorClient client;

    public InterceptBotToUser(IMessageActivity toBot, IConnectorClient client)
    {
        SetField.NotNull(out this.toBot, nameof(toBot), toBot);
        SetField.NotNull(out this.client, nameof(client), client);
    }

    public IMessageActivity MakeMessage()
    {
        var toBotActivity = (Activity)toBot;
        return toBotActivity.CreateReply();
    }

    public async Task PostAsync(IMessageActivity message, CancellationToken cancellationToken = default(CancellationToken))
    {
        await client.Conversations.ReplyToActivityAsync((Activity)message, cancellationToken);
    }
}

public class InterceptBotToUserTranslator : IBotToUser
{
    private readonly IBotToUser inner;
    public InterceptBotToUserTranslator(IBotToUser inner)
    {
        SetField.NotNull(out this.inner, nameof(inner), inner);
    }
    public IMessageActivity MakeMessage()
    {
        return inner.MakeMessage();
    }

    public async Task PostAsync(IMessageActivity message, CancellationToken cancellationToken)
    {
         //TODO: Translate here
        await inner.PostAsync((Activity)message, cancellationToken);
    }
}

1 个答案:

答案 0 :(得分:2)

Bot Builder sdk的 DialogModule 中有评论:https://github.com/Microsoft/BotBuilder/blob/31048a2173313c81a2db47efce6a8a869b4ec284/CSharp/Library/Microsoft.Bot.Builder.Autofac/Dialogs/DialogModule.cs#L419

它声明:

/// <see cref="LogBotToUser"/> is composed around <see cref="MapToChannelData_BotToUser"/> is composed around
/// <see cref="AlwaysSendDirect_BotToUser"/>.  The complexity of registering each component is pushed to a separate
/// registration method, and each of these components are replaceable without re-registering
/// the entire adapter chain by registering a new component with the same component key.

这意味着不需要 InterceptBotToUser 类。您可以使用 InterceptBotToUserTranslator LogBotToUser 替换为以下内容:

builder
     .RegisterType<InterceptBotToUserTranslator>()
     .Keyed<IBotToUser>(typeof(LogBotToUser));

然后修改类本身,使其使用 IActivityLogger 构建,并相应地调用记录器:

public class InterceptBotToUserTranslator : IBotToUser
{
    private readonly IBotToUser inner;
    private readonly IActivityLogger logger;
    public InterceptBotToUserTranslator(IBotToUser inner, IActivityLogger logger)
    {
        SetField.NotNull(out this.inner, nameof(inner), inner);
        SetField.NotNull(out this.logger, nameof(logger), logger);
    }
    public IMessageActivity MakeMessage()
    {
        return inner.MakeMessage();
    }

    public async Task PostAsync(IMessageActivity message, CancellationToken cancellationToken)
    {
        //call the logger
        await this.logger.LogAsync(message);

        //TODO: Translate here

        //post to the next IBotToUser in the chain
        await inner.PostAsync((Activity)message, cancellationToken);
    }
}