首页 > 解决方案 > Botframework如何根据传入请求在启动时更改表存储连接字符串

问题描述

我正在使用与 LUIS 集成的 BotFramework 版本(v4)。在startup.cs文件中的ConfigureServices(IServiceCollection services)方法中,我在中间件中分配存储和 LUIS。下面是示例代码。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton(configuration);

    services.AddBot<ChoiceBot>(options =>
    {    
        options.CredentialProvider = new ConfigurationCredentialProvider(configuration);
        var (luisModelId, luisSubscriptionKey, luisUri) = GetLuisConfiguration(configuration, "TestBot_Dispatch");//
        var luisModel = new LuisModel(luisModelId, luisSubscriptionKey, luisUri);
        var luisOptions = new LuisRequest { Verbose = true };
        options.Middleware.Add(new LuisRecognizerMiddleware(luisModel, luisOptions: luisOptions));

        //azure storage emulater
        //options.Middleware.Add(new ConversationState<Dictionary<string, object>>(new AzureTableStorage("UseDevelopmentStorage=true", "conversationstatetable")));

        IStorage dataStore = new AzureTableStorage("DefaultEndpointsProtocol=https;AccountName=chxxxxxx;AccountKey=xxxxxxxxx;EndpointSuffix=core.windows.net", "TableName");

        options.Middleware.Add(new ConversationState<Dictionary<string,object>>(new MemoryStorage()));
        options.Middleware.Add(new UserState<UserStateStorage>(dataStore));
    }
}

我的机器人将收到来自不同角色的用户的请求,例如(管理员、销售等)。我想根据从传入请求中提取的角色更改传递给中间件的表存储连接字符串。我将通过从传入请求的当前 TurnContext 对象中提取的用户名查询 DB 来获取用户角色。我可以在OnTurn方法中执行此操作,但由于这些已在中间件中声明,我想在中间件本身初始化时更改它们。

标签: c#.net-corebotframeworkazure-bot-servicestate-management

解决方案


在 .NET Core 中,Startup逻辑只在启动时执行一次。

如果我对您的理解正确,您需要能够做的是:在运行时,在多个存储提供程序之间切换,在您的情况下,这些提供程序由它们的底层连接字符串区分。

“盒子里”没有任何东西可以为您启用此方案,但如果使用正确的扩展点并为自己编写正确的管道,这是可能的。具体来说,您可以在该IStatePropertyAccessor<T>层提供自定义抽象,并且您的上游代码将继续在该级别抽象上工作并且不明智。

这是我开始的一个实现,其中包括我称之为ConditionalStatePropertyAccessor. 它允许您创建一种组合IStatePropertyAccessor<T>,该组合配置有默认/后备实例以及N个其他实例,这些实例提供了一个选择器功能,允许他们查看传入的ITurnContext,并基于来自任何部分的一些细节转弯,表明那是应该用于转弯范围的实例。查看测试,您可以看到我如何配置一个示例,该示例基于示例选择实现ChannelId

我现在有点忙,现在不能发货,但我打算把它打包并最终发货。但是,如果您认为它会有所帮助,请随时复制代码供自己使用。


推荐阅读