Sto provando a progettare una soluzione N-Tier per il mio progetto WebAPI esistente.
Ho un progetto WebAPI in cui, al momento, tutte le logiche di business sono scritte nei controller e la convalida dei dati viene effettuata tramite annotazioni.
Questo sta portando a duplicare il codice tra i controller quando sto tentando di implementare la stessa logica.
Quindi ho pensato di spostare le mie Business Logics in Business Layer. Ma per lo più sto affrontando delle sfide nel restituire le convalide aziendali al controller.
Per E.g ho una porzione di codice nel controller come
//Check if User is adding himself
if (RequestUser.Email == model.Email)
{
return BadRequest("Email", "You cannot add yourself as an User");
}
Ora, come posso restituire BadRequest dai metodi di Business Class?
E diventa difficile quando la riga successiva del controller è
IdentityResult result = await UserManager.CreateAsync(user);
if (!result.Succeeded)
{
return result;
}
Quindi non posso restituire entrambi BadRequest & IdentityResult dallo stesso metodo. Inoltre BadRequest, ModelState non è accessibile nei controller. Ovviamente posso aggiungere System.Web.Mvc in BLL, ma sarebbe una buona idea?
Un'altra cosa che mi piacerebbe sapere è che sto creando dei metodi all'interno dei BLL che stanno prendendo ViewModels che ricevo nei controller. È una buona idea per il progetto esistente? O dovrei creare DTO (come i modelli) in BLL e usare AutoMapper per mappare le proprietà e lasciare che BLL funzioni su DTO invece che passare ViewModels.
Penso che quest'ultimo sarebbe più estensibile, ma richiederebbe più tempo.
Infine, se mi suggerisci di andare con DTO, allora devo cambiare a BLL DTO così come a Model quando introduco nuove proprietà, non è una cattiva idea? Anche il codice viene duplicato qui. Dall'altro lato, a partire da ora, cambio anche tutti i relativi ViewModels (a volte 2-4) (che penso non sia l'approccio giusto) quando aggiungo una nuova proprietà ai Modelli.
Quindi qual è l'approccio giusto?