Многопользовательское хранилище данных ботов - PullRequest
0 голосов
/ 26 августа 2018

Я реализовал следующее для мультитенантного лазурного бота в C #, и это прекрасно работает для аутентификации учетных данных приложения.

C #: создание одной службы ботов для поддержки нескольких приложений ботов

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

Однако мне интересно, возможно ли то же самое для хранилища данных ботов? В настоящее время у меня реализовано стандартное хранилище данных бота хранилища таблиц Azure, в котором используется единственная строка подключения, определенная в файле web.config:

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 (как описано в примерах статей). Если я сохраню строку подключения клиентов рядом с их идентификатором приложения и паролем, можно ли получить эту ссылку в представлении зависимости выше, основываясь на том, что клиент / бот сериализует хранилище данных, а затем сохранить / прочитать эти данные в хранилище таблицы клиентов Azure.

1 Ответ

0 голосов
/ 27 августа 2018

Вам необходимо создать собственное хранилище данных ботов, которое реализует IBotDataStore<BotData> и использовать его.Мне удалось получить простой, который каждый раз создавал один и тот же TableBotDataStore.Ниже приведено то, что я использовал, и точка останова в конструкторе получает удар каждый раз, когда я отправляю сообщение.

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 в конструкторе и использовать правильную строку подключения.

...