Hej,
Utknąłem w pewnych kwestiach przy przygotowywaniu prywatnego projektu (Dziennik szkolny), nie chciałbym na starcie pomieszać kilku rzeczy żeby pod koniec musieć wszystko sprzątać.
Nie do końca rozumiem pewnych kwestii.
- Czy jeden kontroler może (czy jest to wskazane) korzystać z kilku serwisów?
Mam StudentController, w którym chciałbym udostępniać listę oceń ucznia
Pod adresem students/{id}/grades, do tego potrzebuję skorzystać z serwisu, który dostarczy mi listę tych ocen
Przykład
public StudentController(IStudentService studentService, IGradeService gradeService)
{
_studentService = studentService;
_gradeService = gradeService;
}
[HttpGet("{StudentId}/grades")]
public async Task<IActionResult> GetGrades([FromRoute] GetStudentGradesRequest getStudentRequest)
{
var result = await _gradeService.GetStudentGrades(getStudentRequest);
return result.Match<IActionResult>(error => error switch
{
DataNotFoundError _ => NotFound(error),
_ => StatusCode(StatusCodes.Status500InternalServerError, error)
}, _ => Ok(result.Data));
}
public class GetStudentGradesRequest
{
public int StudentId { get; set; }
}
Czy powinienem do tego zastosować jakieś inne podejście w kwestii wrzucania serwisów do kontrolera? Jest jakiś bardziej pożądany/odpowiedni sposób?
- Validacja id przy PUT
W tym samym kontrolerze wystawiam również endpoint PUT przyjmujący id i obiekt z nowymi danymi ucznia, w projekcie korzystam z FluentValidation i chciałbym zwrócić odpowiednią wiadomość, gdy użytkownik spróbuje uderzyć w endpoint z id < 1
[HttpPut("{id:int:min(1)}")]
public async Task<IActionResult> Update(int id, [FromBody]UpdateStudentRequest studentData)
{
var result = await _studentService.Update(id, studentData);
return result.Match<IActionResult>(error => error switch
{
DataNotFoundError _ => NotFound(error),
_ => StatusCode(StatusCodes.Status500InternalServerError, error)
}, _ => Ok());
}
Mam na to kilka pomysłów, ale żaden mnie nie satysfakcjonuje
- Nie informować użytkownika o tym, a korzystając (jak teraz) z constraintów uniemożliwić korzystanie z PUT dla takiego id
- Zrobić validację na początku metody Update (if id < 1 ...)
- Utworzyć walidację dla dto (Student) i po zmapowaniu sprawdzać czy spełnia warunki
- Pozwolić użytkownikowi uderzać w bazę i potraktować to tak samo jakby próbował dostać danę o uczniu z id, którego nie ma w bazie (notfound)
Aventusjak się ma sam MediatR bez cqrs?
imo to MediatR chyba można też traktować jako taką nakładkę czy może konwencje/pomysł jak poukładać projekt.:)
nierzadko widziałem dyskusje typupo co mediatr którego zadaniem jest przekierowanie inputu do handlera, czyli właściwie tego samego co robi ASP, http -> controller
. Ja uznałem że MediatR = konwencje i pewien pomysł na to jak może wyglądać projekt, chociaż to chyba temat podobny do design patternów, bo niby nie narzucają implementacji, a bardzo często(?) ludzie mają jakąś konkretną na myśli.IUserMapper
- strach się bać, co to za potwór. Do tego repozytorium w kontrolerze. A na domiar złego te średnio potrzebneArgumentNullException
.