当前位置: 首页 > 知识库问答 >
问题:

Azure 聊天机器人中间件的依赖注入?

章翔宇
2023-03-14

我正在使用Azure机器人服务和QnAMaker开发一个新的聊天机器人。我们正在使用BotBuilder中间件,包括自定义中间件,来定制机器人行为。

其中一个中间件将调用Azure函数,我想在自定义中间件中使用新的<code>HttpClientFactory<code>功能,但这需要依赖注入。

我如何在BotBuilder中间件中使用依赖注入,就像你使用常规。网芯中间件?

当您查看Startup.cs中的bot配置时,您可以看到它如何要求您更新所有bot依赖项:

services.AddHttpClient<MyFunctionClient>(client =>
{
    client.BaseAddress = new Uri(mySettings.GetValue<string>("myFunctionUrl"));
    client.DefaultRequestHeaders.Add("x-functions-key", mySettings.GetValue<string>("myFunctionKey"));
});

services.AddBot<QnAMakerBot>(options =>
{  
    options.CredentialProvider = new ConfigurationCredentialProvider(Configuration);

    options.ConnectorClientRetryPolicy = new RetryPolicy(
        new BotFrameworkHttpStatusCodeErrorDetectionStrategy(),
        3,
        TimeSpan.FromSeconds(2), 
        TimeSpan.FromSeconds(20),
        TimeSpan.FromSeconds(1));

    var middleware = options.Middleware;
    middleware.Add(new ConversationState<ChatLog>(new MemoryStorage()));
    middleware.Add(new MyCustomMiddleware()); // <- I want to inject a typed HttpClient here

//... etc. ....

有没有一种不同的方式来配置允许依赖注入的机器人?

如果< code>MyCustomMiddleware在其构造函数中需要一个类型化的< code>HttpClient,我就必须在这里创建一个新的实例,这样我就不能从我刚刚设置的DI和配置中获益。

共有1个答案

都建树
2023-03-14

虽然我不是服务定位器模式的粉丝,但机器人配置的当前设计不是很依赖注入友好。

利用机器人中间件的设置方式的性质,但必须在启动期间提供新实例,我想出了以下解决方法。

public class BotMiddlewareAdapter<TMiddleware> : IMiddleware
    where TMiddleware : IMiddleware {
    private readonly Lazy<TMiddleware> middleware;

    public BotMiddlewareAdapter(IServiceCollection services) {
        middleware = new Lazy<TMiddleware>(() =>
            services.BuildServiceProvider().GetRequiredService<TMiddleware>());
    }

    public Task OnTurn(ITurnContext context, MiddlewareSet.NextDelegate next) {
        return middleware.Value.OnTurn(context, next);
    }
}

它将IServiceCollection作为显式依赖项,并推迟服务提供者的创建和工厂委托中实际中间件的最终解决。

然后可以使用以下命令实现它

middleware.Add(new BotMiddlewareAdapter<MyCustomMiddleware>(services));

当适配器被调用时,它将在初始调用时延迟解析预期的中间件,然后调用它。

实际上,您可以更进一步,将其转换为扩展方法

public static class BotBuilderMiddlewareExtension {
    public static void Add<TMiddleware>(this IList<IMiddleware> middleware, IServiceCollection services) 
        where TMiddleware : IMiddleware {
        middleware.Add(new BotMiddlewareAdapter<TMiddleware>(services));
    }
}

这简化了设置

middleware.Add<MyCustomMiddleware>(services);
 类似资料:
  • 译者:毛毛虫 作者: Matthew Inkawhich 在本教程中,我们探索了一个好玩和有趣的循环序列到序列的模型用例。我们将用 Cornell Movie-Dialogs Corpus处的电影剧本来训练一个简单的聊天机器人。 在人工智能研究领域中对话模型模型是一个非常热门的话题。聊天机器人可以在各种设置中找到,包括客户服务应用和在线帮助。这些机器人通常由基于检索的模型提供支持,这些输出是某些形

  • 本文向大家介绍Python QQBot库的QQ聊天机器人,包括了Python QQBot库的QQ聊天机器人的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码,供大家参考,具体内容如下 项目地址:https://github.com/pandolia/qqbot 1.安装 2.主动发出消息 3.根据事件回复消息 首先我们需要在命令行启动

  • 本文向大家介绍Python如何实现机器人聊天,包括了Python如何实现机器人聊天的使用技巧和注意事项,需要的朋友参考一下 今天午休的时候,无意之中看了一篇博客,名字叫Python实现机器人,感觉挺有的意思的。 于是用其写了一个简单的Python聊天,源码如下所示: 注意:如果出现某某模块找不到的时候,记得使用pip安装对应的模块。 效果图如下所示: 唯一美中不足的是英文,不过没关系,国内有图灵机

  • 聊天机器人是可行的 我:chatbot,你好! chatbot:你也好! 我:聊天机器人可行吗? chatbot:你不要怀疑这是天方夜谭,我不就在这里吗?世界上还有很多跟我一样聪明的机器人呢,你听过IBM公司在2010年就研发出来了的Watson问答系统吗?它可比我要聪明100倍呢 我:噢,想起来了,据说Watson在智力竞赛中竟然战胜了人类选手。但是我了解到它有一些缺陷:因为它还只是对信息检索技

  • 智能机器人可以做到的事情可以很复杂:文字、语音、视频识别与合成;自然语言理解、人机对话;以及驱动硬件设备形成的“机器”人。作为一个只有技术和时间而没有金钱的IT人士,我仅做自然语言和人工智能相关的内容,不涉及硬件,也不涉及不擅长的多媒体识别和合成。所以索性就做一个可以和你说话,帮你解决问题的聊天机器人吧。

  • 我有一个时间触发的Azure功能