首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多租户机器人数据存储

多租户机器人数据存储
EN

Stack Overflow用户
提问于 2018-08-26 10:05:05
回答 1查看 248关注 0票数 1

我已经在C#中为一个多租户azure机器人实现了以下内容,这对于验证应用程序的凭据非常有效。

C# : Creating a Single Bot Service to Support Multiple Bot Applications

https://www.microsoft.com/developerblog/2017/01/10/creating-a-single-bot-service-to-support-multiple-bot-applications/

然而,我想知道机器人数据存储是否也可以做到这一点?我目前有一个标准的Azure Table存储机器人数据存储,它使用在web.config中定义的单个连接字符串:

代码语言:javascript
复制
Conversation.UpdateContainer(
            builder =>
            {
                builder.RegisterModule(new ReflectionSurrogateModule());

                builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));

                //var store = new InMemoryDataStore();

                var store = new TableBotDataStore(ConfigurationManager.AppSettings["BotStorage"]);

                builder.Register(c => store)
                    .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
                    .AsSelf()
                    .SingleInstance();
            });

在我的ICredentialProvider实现中(如文章示例所述)。如果我将客户连接字符串与他们的应用程序ID和密码一起存储,是否可以基于序列化数据存储的客户/机器人在上面的依赖项注入中提取该引用,然后将该数据保存/读取到customers Azure表存储中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-27 23:19:40

您需要创建一个实现IBotDataStore<BotData>的自定义机器人数据存储并使用它。我能够得到一个简单的方法,每次都创建相同的TableBotDataStore。下面是我使用的方法,每次我发送消息时,构造器中的断点都会被击中。

代码语言:javascript
复制
public class CustomBotStore : IBotDataStore<BotData>
{
    private IBotDataStore<BotData> _store;

    public CustomBotStore()
    {
        string connString = ConfigurationManager.ConnectionStrings["BotState"].ConnectionString;

        _store = new TableBotDataStore(connString, "testbotdata"); // requires Microsoft.BotBuilder.Azure Nuget package 
    }

    public Task<bool> FlushAsync(IAddress key, CancellationToken cancellationToken)
    {
        return _store.FlushAsync(key, cancellationToken);
    }

    public Task<BotData> LoadAsync(IAddress key, BotStoreType botStoreType, CancellationToken cancellationToken)
    {
        return _store.LoadAsync(key, botStoreType, cancellationToken);
    }

    public Task SaveAsync(IAddress key, BotStoreType botStoreType, BotData data, CancellationToken cancellationToken)
    {
        return _store.SaveAsync(key, botStoreType, data, cancellationToken);
    }
}


public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);

        Conversation.UpdateContainer(
        builder =>
        {
            builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));

            builder.Register(c => new CustomBotStore())
                .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
                .AsSelf()
                .InstancePerLifetimeScope();
        });
    }
}

我不确定每个生命周期范围拥有一个实例的含义是什么,因为示例使用单个实例。但是您应该能够使用它,然后在构造函数中检查HttpContext并使用正确的连接字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52022638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档