Architettura pulita: creazione di un'entità da un insieme di altre entità

4

Ho un'app che raccoglie punti dati per tutto il giorno.

Ogni punto dati è memorizzato in una tabella DataPoint (che è persistente nella tabella DATA_POINTS ).

Ho anche un DataPointRepository con operazioni CRUD di base, ma anche metodi per ottenere valori medi, min e amp; max datapoint.

Alla fine di ogni giornata voglio comprimere i dati in DATA_POINTS in un'entità DataPointsDay che contenga solo i valori medio, massimo e minimo, quindi la persistono nella tabella DATA_POINTS_DAYS . (Ma per il giorno corrente voglio anche essere in grado di recuperare l'oggetto DataPointsDay in qualsiasi momento senza persisterlo ancora)

Quale è un buon modo per farlo? Inizialmente volevo passare DataPointsRepository al costruttore DataPointsDay , ma presumo che viola l'architettura pulita in quanto l'entità non dovrebbe conoscere il repository? Avrebbe senso creare un DataPointsDayFactory in modo che io possa ottenere l'oggetto in qualsiasi momento, e anche un CreateDataPointsDayInteractor che crea l'oggetto DataPointsDay e poi lo persiste nel database?

    
posta HPage 24.04.2017 - 16:51
fonte

1 risposta

5

Il tuo errore è che stai pensando erroneamente a DataPoint e DataPointsDay come alla tua entità aziendale, quando in realtà non sono altro che dettagli sulla persistenza. Non so cosa rappresentino questi punti, ma facciamo finta che siano la temperatura della CPU (so che non è questo il caso, ma puoi cambiare ciò che mai rappresenti per questo)

class CPUTemp
{
     int Min;
     int Max;
     int Average;
     string Unit;
}

La CPU Temp è la tua entità, non i datapoint. Quindi avresti un CPUTempRepostory

Il tuo CPUTempRepo sarebbe responsabile dell'aggiunta di nuovi record e della compressione (potresti sostenere che la compressione va in una classe separata, ma manteniamo le cose semplici)

CPUTempRepository.GetData (DateTime day)

Se fosse oggi, il pronti contro termine passerebbe al giorno corrente e calcolerebbe le medie, se fosse un giorno passato andrebbe alla tabella compressa e lo esaminerebbe. Il resto della tua app non si preoccuperebbe affatto da quale tavolo proviene.

Spero che questo risolva i tuoi problemi senza dover trasferire repository alle entità, che dovresti evitare.

DataPoint e DataPointsDay NON sono due entità separate, o addirittura entità, sono solo due modi separati di MEMORIZZARE una singola entità.

Il tuo codice dovrebbe apparire in questo modo:

class CPUTempRepository
{
     public CPUTemp getCPUTemp(Date d)
     {
         myBusinessModels.CPUTemp output = new CPUTemp();
         if (d == today)
         {
             ORM.myMyDb.DataPoint data = ORM.Get(d);
             //do summation/average
             output.setThing(data.getThing());
             //ect
         }
         else
         {
            ORM.myMyDb.DataPointsDay datum = ORM.Get(d);
            output.setThing(datum.getThing());
            //ect
         }
         return output;
     }
}
    
risposta data 24.04.2017 - 17:14
fonte

Leggi altre domande sui tag