Botframework Как изменить строку подключения к хранилищу таблицы при запуске на основе входящего запроса - PullRequest
0 голосов
/ 06 февраля 2019

Я использую версию BotFramework (v4), интегрированную с LUIS.В ConfigureServices (IServiceCollection services) метод в файле startup.cs Я назначаю хранилище и 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));
    }
}

Мой бот будет получать запросы от пользователей разных ролей, таких как (admin, sales и т. Д.). Я хочу изменить строку подключения к хранилищу таблиц, передаваемую промежуточному программному обеспечению, на основе роли, извлеченной из входящего запроса .Я получу роль пользователя, запросив DB из имени пользователя, извлеченного из текущего объекта TurnContext входящего запроса.Я могу сделать это в методе OnTurn , но так как они уже объявлены в промежуточном программном обеспечении, я хотел изменить их при инициализации в самом промежуточном программном обеспечении.

1 Ответ

0 голосов
/ 12 февраля 2019

В .NET Core логика Startup выполняется только один раз при, э-э, запуске. 100

Если я вас правильно понимаю, вам нужно уметь: во время выполнения переключаться междунесколько провайдеров хранения, которые, в вашем случае, различаются по своей базовой строке подключения.

Нет ничего "в коробке", которое бы включило этот сценарий для вас, но возможно , если использоватьправильные точки расширения и напишите правильный сантехника для себя.В частности, вы можете предоставить настраиваемую абстракцию на уровне IStatePropertyAccessor<T>, и ваш вышестоящий код будет продолжать работать на этом уровне абстракции и быть неискушенным.

Вот реализация, которую я начал,включает в себя то, что я называю ConditionalStatePropertyAccessor.Это позволяет вам создать своего рода составной IStatePropertyAccessor<T>, который настроен как с экземпляром по умолчанию / резервный, так и с N другими экземплярами, которые снабжены функцией выбора, которая позволяет им просматривать входящий ITurnContext и, основываясь на некоторых деталях из любой части поворота, указывают, что это тот экземпляр, который следует использовать для охвата поворота. Посмотрите на тесты, и вы увидите, как я настраиваю образец, который выбирает реализацию на основе, например, ChannelId.

В данный момент я немного занят и могуне отправлю это прямо сейчас, но я собираюсь упаковать его и отправить в конце концов.Однако, если вы считаете, что это будет полезно, просто скопируйте код для собственного использования.?

...