Привязка ядра .Net к конкретной модели с заданным значением QueryString - PullRequest
0 голосов
/ 11 февраля 2019

Я занимаюсь рефакторингом API-интерфейса аналитики, который должен позволять клиентам отправлять события в виде HTTP-запросов GET, а их данные «Hit» кодируются в URL-адресах Параметры QueryString .

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

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

Проблема, с которой я столкнулся, заключается в том, что, основываясь на типе Hit, я хотел бычтобы иметь возможность предположить тип каждого поля, данное мне, что требует привязки модели.Конечно.В настоящее время я могу выяснить, какую модель проверять только после проверки значения type - что может привести к чрезмерному увеличению API "строковому типу"

Примером маршрута может быть:

GET https://my.anonymousanalytics.net/capture?type=startAction&amount=300&so_rep=true

Следовательно, мой Hit будет:

{
  type: "startAction",
  amount: 300,
  so_rep: true
}

Который, гипотетически, может быть привязан к модели StackOverflowStartHitModel

class StackOverflowStartHitModel {
  public string type { get; }  // Q: Could I force the value of this to be "startAction"?
?  public int amount { get; }
  public boolean so_rep { get; }
}

Почему я спрашиваю это здесь?Ну, я обычно являюсь разработчиком JavaScript, но все, к кому я обычно обращаюсь за мудростью на C #, не работают с гриппом.

Я экспериментировал с декоратором атрибутов [FromQuery], но меня беспокоит то, чтодля хитов, которые имеют точно такую ​​же форму, я не смог бы определить разницу между, например, startAction или endAction.

1 Ответ

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

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

Ваша модель выглядит следующим образом:

public class StackOverflowModel 
{
  public string type { get; set;}
  public int amount { get; set; }
  public bool so_rep { get; set;}
}

не имеет значения, какое значение имеет ваш *Поле 1006 * type имеет, и вам также не нужно жестко его кодировать, оно будет зафиксировано как есть, а затем его можно будет проверить на наличие действительных состояний.

Есть несколько способов сделать это, о которых я могу подумать.

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

Другой вариант - использовать методы сопоставления с образцом, как описано здесь: https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching

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

Вы не приводили примеры допустимых и недействительных состояний, но я предполагаю, что вы на самом деле говорите о вариациях этих 3 параметров, таких как, когда тип - "что-то"тогда сумма может быть <200, а so_rep может быть только «что угодно».Это можно сделать с помощью библиотеки FluentValidation. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...