我们实施了 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);
}
}
答案 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);
}
}