Gdzie łączyć dane z wielu obiektów w obiekt wynikowy

0

Mam api a w nim kontroler i serwisy. W response chciałbym zwrocic obiekt na który składają się dane z kilku innych obiektów i mam pytanie w którym miejscu łączyć te dane w obiekt wynikowy, czy wszsytko łączyć w kontrolerze, czy np powinienem miec jeszcze jeden serwis albo kolejną metodę w serwisie ktory wyciagnie z obiektow co potrzeba i zwroci obiekt wynikowy?

Czy lepiej robić tak:

public class MyController : Controller
{
  // ...
  public async Task<IActionResult> GetData(int id)
  {
   var data1 = await service.GetData1();
   var data2 = await service.GetData2();
   var data3 = await service.GetData3();
   var obj= new ResultObject();
   obj.Prop1 = data1.A1;
   obj.Prop2 = data2.A2;
   obj.Prop3=data3.A3;

  var result = mapper.Map<Result>(obj);
  return Ok(result);
  }
}

czy tak:

public class MyService()
{
   public async Task<Data1> GetData1()
   {
     // ...
   }

   public async Task<Data2> GetData2()
   {
     // ...
   }

public async Task<Data3> GetData3()
   {
     // ...
   }

public async Task<ResultObject> GetResult()
   {
    var data1 = await GetData1();
   var data2 = await GetData2();
   var data3 = await GetData3();
   var obj= new ResultObject();
   obj.Prop1 = data1.A1;
   obj.Prop2 = data2.A2;
   obj.Prop3=data3.A3;
return obj;
   }

 
}


public class MyController : Controller
{
  // ...
  public async Task<IActionResult> GetData(int id)
  {
   var data = await service.GetResult();
   var result = mapper.Map<Result>(data);
   return Ok(result);
  }
}

czy jeszcze inaczej? :)

1

Opcja 2, jeszcze te GetData powinny być private (ogólnie wszystko co nie musi być public nie powinno być public).
Wywołanie Mappera też bym przeniósł do service.

1

Spotkałem oba podejścia. Zazwyczaj optuję za takim podejściem, w którym kontroler wykonuje jak najmniej logiki biznesowej, wszystko to upchnięte jest w serwis. Powody:

  • Metody kontrolera są krótkie i zwięzłe, w odwrotnym podejściu miały tendencję do niebezpiecznego rozrastania się
  • Kontroler już jest odpowiedzialny za uprawnienia, routing, sprawdzenie parametrów zapytania, zwrócenie odpowiedniego kodu w odpowiedzi - to dostatecznie dużo odpowiedzialności, żeby dorzucać jeszcze więcej
  • Umieszczając logikę w metody serwisu łatwiej będzie Ci je re-użyć, gdy przyjdzie pracować nie tylko z MVC/WebAPI (http ogólnie), ale i innym mechanizmem wejścia (kolejki, konsola, apka ui)
0

@Salin: co do mappera to Result jest klasą opowiedzi i czytalem ze to co dotyczy takich klas nie powinno byc w serwisach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1