Организация c# помощник проекта или служебные классы

Вам придется учесть разницу между Лексом и Алекса. Наиболее заметными различиями являются форматы запросов и ответов.

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

  1. Основные различия между форматами и передачей sessionAttribtues и slots.
  2. У Lex есть 4 встроенных slotTypes, которые Alexa не использует (пока?): AMAZON.EmailAddress,, AMAZON.Percentage, AMAZON.PhoneNumber, AMAZON.SpeedUnit и AMAZON.WeightUnit. ( Ссылка. )
  3. Lex всегда пропускает полный пользовательский ввод через inputTranscript. Алекса нет.
  4. Alexa предоставляет resolutions для значений слотов, но заполняет фактическое значение слотов необработанными данными, извлеченными из ввода.
  5. Lex автоматически разрешит значение слота, если для этого установлены синонимы slotType.

После работы с ними обоими довольно часто, и часто имея дело с этим, я предпочитаю Лекса, а не Алекса. Я обнаружил, что Lex проще и обеспечивает больше свободы для разработчика и контроля, даже если вы должны соответствовать ограничениям каждого из выходных каналов Lex.

Сравнить форматы запросов / ответов:

Формат Alexa JSON
Формат Lex JSON [1131 ]

Пример запроса Alexa:

{
  "version": "1.0",
  "session": {
    "new": true,
    "sessionId": "amzn1.echo-api.session.[unique-value-here]",
    "application": {
      "applicationId": "amzn1.ask.skill.[unique-value-here]"
    },
    "attributes": {
      "key": "string value"
    },
    "user": {
      "userId": "amzn1.ask.account.[unique-value-here]",
      "accessToken": "Atza|AAAAAAAA...",
      "permissions": {
        "consentToken": "ZZZZZZZ..."
      }
    }
  },
  "context": {
    "System": {
      "device": {
        "deviceId": "string",
        "supportedInterfaces": {
          "AudioPlayer": {}
        }
      },
      "application": {
        "applicationId": "amzn1.ask.skill.[unique-value-here]"
      },
      "user": {
        "userId": "amzn1.ask.account.[unique-value-here]",
        "accessToken": "Atza|AAAAAAAA...",
        "permissions": {
          "consentToken": "ZZZZZZZ..."
        }
      },
      "apiEndpoint": "https://api.amazonalexa.com",
      "apiAccessToken": "AxThk..."
    },
    "AudioPlayer": {
      "playerActivity": "PLAYING",
      "token": "audioplayer-token",
      "offsetInMilliseconds": 0
    }
  },
  "request": {}
}

Пример запроса Lex:

{
  "currentIntent": {
    "name": "intent-name",
    "slots": {
      "slot name": "value",
      "slot name": "value"
    },
    "slotDetails": {
      "slot name": {
        "resolutions" : [
          { "value": "resolved value" },
          { "value": "resolved value" }
        ],
        "originalValue": "original text"
      },
      "slot name": {
        "resolutions" : [
          { "value": "resolved value" },
          { "value": "resolved value" }
        ],
        "originalValue": "original text"
      }
    },
    "confirmationStatus": "None, Confirmed, or Denied (intent confirmation, if configured)"
  },
  "bot": {
    "name": "bot name",
    "alias": "bot alias",
    "version": "bot version"
  },
  "userId": "User ID specified in the POST request to Amazon Lex.",
  "inputTranscript": "Text used to process the request",
  "invocationSource": "FulfillmentCodeHook or DialogCodeHook",
  "outputDialogMode": "Text or Voice, based on ContentType request header in runtime API request",
  "messageVersion": "1.0",
  "sessionAttributes": { 
     "key": "value",
     "key": "value"
  },
  "requestAttributes": { 
     "key": "value",
     "key": "value"
  }
}

24
задан John Saunders 11 January 2013 в 18:39
поделиться

6 ответов

Я всегда позволяю подобным вещам быть довольно подвижными. При этом:

  1. Я тестирую классы-помощники так же, как и любые другие классы. Поэтому они, как правило, не статичны.
  2. Я могу начать с создания этих помощников в виде отдельных методов, когда это необходимо. Когда я обнаруживаю, что они нужны более чем в одном классе, я переношу их в собственный класс или класс "Utilities" в том же проекте.
  3. Если я обнаруживаю, что они нужны более чем в одном проекте, я перемещаю их выше по "иерархии": из проекта в решение, из решения в подсистему, из подсистемы в приложение, из приложения в библиотеку или фреймворк и т.д.
19
ответ дан 29 November 2019 в 00:11
поделиться

Я склонен делать комбинацию того, что делают Рэндольфо и Бен: я использую статические вспомогательные классы в папке «Utilities» в пространстве имен Utilities. Лучшая организация файлов, сохраняющая остальную часть пространства имен приложения чистой.

2
ответ дан 29 November 2019 в 00:11
поделиться

Я склонен помещать их в пространство имен утилит. Либо в пространстве имен основного проекта, если они довольно общие, например MyProject.Utils.MyHelperClass, или, если они более конкретны, то подпространство имен MyProject.CRM.Utils.MyCRMHelperClass.

1
ответ дан 29 November 2019 в 00:11
поделиться

Мы поместите такие классы в сборку с именем Common , например, предназначенную для использования всеми проектами, которым это необходимо, за исключением случаев, когда помощнику необходимо использовать некоторые бизнес-объекты или основные объекты.

1
ответ дан 29 November 2019 в 00:11
поделиться

Большинство из нас просто помещает их в папку «Помощники».

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

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

Даже тогда пересмотрите.

1
ответ дан 29 November 2019 в 00:11
поделиться

У меня почти всегда есть библиотека классов MyProject.Core в моем решении, куда я помещаю такие вещи.

Edit: Я мог бы ответить на более «большой» вопрос.

В одном проекте все зависит от размера проекта. В Руководстве по дизайну Microsoft говорится о том, что вам не следует создавать пространство имен, если в нем меньше пяти (поправьте меня, если я ошибаюсь насчет этого числа) типов.

2
ответ дан 29 November 2019 в 00:11
поделиться
Другие вопросы по тегам:

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