Хорошая идея получить доступ к сессии в наблюдателе или нет?

При создании службы QnA создаются следующие ресурсы

  1. План обслуживания приложений
  2. Служба приложений
  3. Служба поиска
  4. Когнитивные службы
  5. [ 1112] Application Insights

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

Скорее всего, ваша КБ была открыта в браузере перед удалением ваших ресурсов. Итак, когда вы нажимаете «Удалить» сейчас, после удаления ресурсов, QnA Maker не может найти фоновые сервисы.

Соответственно, если вы обновите свой браузер, вы не найдете свой KB

Обновление

Чтобы уточнить, как распознавать ресурсы, связанные с вашей базой знаний, давайте предположим, что ваш хост развертывания базы знаний - https://qnaappservice1.azurewebsites.net/qnamaker, это означает следующее

  • Соответствующее имя AppService - qnaappservice1
  • Соответствующее имя SearchService - qnaappservice1-[Random postfix] подобно [113 ].

Остальные ресурсы будут названы в зависимости от вашей службы QnA. Например, если ваша служба QnA называется qnaservice1, ваши оставшиеся ресурсы будут следующими:

  • План обслуживания приложения будет qnaservice1
  • , когнитивная служба будет [116 ]
  • Информация о приложении будет qnaservice1-ai
7
задан 4 revs, 3 users 100% 25 September 2008 в 14:12
поделиться

5 ответов

Я нахожу, что это очень интересный вопрос. Я собираюсь думать вслух здесь момент...

В конечном счете то, с чем мы сталкиваемся, является решением нарушить шаблон разработки приемлемая практика для достижения определенного набора функциональности. Так, мы должны спросить нас

1) Каковы возможные решения, которые не нарушили бы шаблон MVC

2) Каковы возможные решения, которые нарушили бы шаблон MVC

3) Какой вариант является наилучшим? Я считаю шаблоны разработки и общепринятую практику очень важными, но в то же время если придерживающийся их делает Ваш код более сложным, затем правильное решение может состоять в том, чтобы нарушить практику. Некоторые люди могли бы не согласиться со мной на этом.

Позволяет рассматривают № 1 сначала.

Первое, что пришло на ум я думал бы о следующих возможных решениях

A) Если Вы действительно интересуетесь тем, кто выполняет эти действия, эти данные должны храниться в модели какой-либо путь? Это сделало бы эту информацию доступной для Вашего Наблюдателя. И это также означает, что любая другая вызывающая сторона фронтенда Вашего класса ActiveRecord получает ту же функциональность.

B) Если Вы действительно не интересуетесь пониманием, кто создал запись, но более интересующийся входом самих веб-действий, то Вы могли бы рассмотреть "наблюдение" действий контроллера. Прошло некоторое время, так как я ввел по абсолютному адресу вокруг источника направляющих, таким образом, я не уверен кто их ActiveRecord:: Наблюдатель "наблюдает" модель, но Вы смогли адаптировать ее к наблюдателю контроллера. В этом смысле Вы не наблюдаете модель больше, и имеет смысл делать сессию и другую информацию о данных типа контроллера тому наблюдателю. C) Простое решение, с наименьшим количеством "структуры", состоит в том, чтобы просто отбросить Ваш код входа в конце Ваших методов действия, которые Вы наблюдаете.

Рассмотрите опцию № 2 теперь, повредив методы MVC.

A) Как Вы предполагаете, Вы могли найти средства для того, чтобы заставлять Вашу модель Observer иметь доступ к данным Сессии. Вы связали свою модель с Вашей бизнес-логикой.

B) Не может думать ни о каких других здесь :)

Мой персональный наклон, не зная больше детализирует о Вашем проекте, или 1 А, если я хочу присоединить людей к записям, или 1C, если существует только несколько мест, где я интересуюсь выполнением этого. Если Вы действительно желаете устойчивое решение для входа для всех своих контроллеров и действий, Вы могли бы рассмотреть 1B.

Наличие Вашего образцового наблюдателя находит, что данные сессии являются немного "вонючими", и вероятно повредились бы, если Вы пытались использовать свою модель в каком-либо другом проекте/ситуации/контексте.

3
ответ дан 6 December 2019 в 23:16
поделиться

Hrm, это - липкая ситуация. В значительной степени необходимо нарушить MVC для получения его работающий приятно.

Я сделал бы что-то вроде этого:

class MyObserverClass < ActiveRecord::Observer
  cattr_accessor :current_user # GLOBAL VARIABLE. RELIES ON RAILS BEING SINGLE THREADED

  # other logging code goes here
end

class ApplicationController
  before_filter :set_current_user_for_observer

  def set_current_user_for_observer
    MyObserverClass.current_user = session[:user]
  end
end

Это - немного hacky, но это больше не hacky, чем много других базовых вещей направляющих, которые я видел.

Все, что необходимо было бы сделать для создания этого ориентированным на многопотоковое исполнение (это только имеет значение, работаете ли Вы на jruby так или иначе) должно изменить cattr_accessor, чтобы быть правильным методом и иметь его хранилище, это - данные в локальной памяти потока

6
ответ дан 6 December 2019 в 23:16
поделиться

Вы правы относительно этого повреждающий MVC. Я предложил бы использовать обратные вызовы в Ваших контроллерах, главным образом потому что существуют ситуации (как модель, какое сохранение называют, но приводит проверку к сбою), где Вы не хотели бы наблюдателя, регистрирующего ничто.

1
ответ дан 6 December 2019 в 23:16
поделиться

Я нашел, что очевидный способ сделал то, что предлагается ответом, который я выбрал.

http://pjkh.com/articles/2009/02/02/creating-an-audit-log-in-rails

Это решение использует модель AuditLog, а также модуль TrackChanges для добавления функциональности отслеживания к любой модели. Это все еще требует, чтобы Вы добавили строку к контроллеру, когда Вы обновляете или создаете все же.

1
ответ дан 6 December 2019 в 23:16
поделиться

В прошлом при выполнении чего-то вроде этого, я склонялся к расширению класса модели User для включения идеи 'текущего пользователя'

Смотря на предыдущие ответы, я вижу предложения для хранения фактического активного рекордного пользователя на сессии. Это имеет несколько недостатков.

  • Это хранит возможно большой объект в базе данных сессии
  • Это означает, что копия пользователя 'кэшируется' навсегда (или пока выход из системы не вызывается). Это означает, что любые изменения в состоянии этого пользователя не будут распознаны, пока пользователь не выйдет из системы и входит в. Это означает, например, та попытка отключить пользователя будет ждать его выходить из системы и назад на. Это - вероятно, не поведение, которое Вы хотите.

Так, чтобы в начале запроса (в фильтре) Вы взяли user_id от сессии и считали пользователя, установку User.current_user.

Что-то вроде этого...

class User
  cattr_accessor :current_user
end

class Application
  before_filter :retrieve_user

  def retrieve_user
    if session[:user_id].nil?
      User.current_user = nil
    else
      User.current_user = User.find(session[:user_id])
    end
  end
end

С тех пор это должно быть тривиально.

0
ответ дан 6 December 2019 в 23:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: