Здравствуйте, MadHuman, Вы писали:
MH>ну да. кейс как раз и такой. клиент передал неверное значение аргумента.
Тогда нужно отфутболить запрос, не доходя даже до контроллера
В современном asp.net для этого очень много средств, смотри
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-6.0
Если не хватает атрибутов модели, то используй
IValidatableObject
S>>То есть хэндлер рест-апи должен проверить аргументы, и только если они в порядке, ехать дальше.
MH>необязательно. задачу по проверке аргумента можно делегировать GetThing (т.к. она там внутри лучше знает что и как проверять).
Обязательно. То что ты предлагаешь это "проектирование снизу вверх", что почти всегда является антипаттерном.
MH>вопрос в том как это лучше обработать. дублировать в хэндлере логику проверки плохо, вынести код проверки аргумента из GetThing в отдельную функцайку
MH>и в хэндлере её дернуть — можно
И нужно, а по возможности вынести в атрибут валидации или в реализацию IValidatableObject.Validate
MH>но ... нехотелось бы.
Ты сам создал ограничения и с ними борешься. Ради чего?
MH>примерно так
MH>MH>//рабочая функция. размещена в другом месте от хэндлера
MH>public static object GetThing(string arg1){
MH> if ( some condition for arg1) {
MH> throw new ArgumentException("arg1 invalid");
MH> }
MH> //do work
MH>}
MH>//хэндлер для апи ендпойнта
MH>public static object ProcApiRequest(string arg1, string arg2){
MH> try {
MH> var result1 = GetThing(arg1);
MH> var result2 = DoSomeOtherWork(result1);
MH> return MakeOutPut(result2);
MH> } catch (ArgumentException ae){
MH> return new HttpError(400, ae.Message);
MH> }
MH>}
MH>
А чем это принципиально лучше, чем:
public static object GetThing(string arg1){
//do work
}
//хэндлер для апи ендпойнта
public static object ProcApiRequest(string arg1, string arg2){
if ( some condition for arg1) {
this.ModelState.AddModelError(nameof(arg1),"Condition failed");
}
if ( some other condition for arg2) {
this.ModelState.AddModelError(nameof(arg2),"Condition failed");
}
if(!this.ModelState.IsValid) {
return BadRequest(this.ModelState);
}
var result1 = GetThing(arg1);
var result2 = DoSomeOtherWork(result1);
return MakeOutPut(result2);
}
?