Modellare contesto evitando riferimenti circolari ASP.NET Core 6

di il
5 risposte

Modellare contesto evitando riferimenti circolari ASP.NET Core 6

Ciao,
mi trovo a dover modellare una situazione nella quale finisco facilmente ad avere riferimenti circolari. Il problema si pone non tanto lato database (dove utilizzo PostgreSQL) quando lato server (ASP.NET Core, in particolare .NET 6).

In particolare il problema si verifica quando vado a modellare i seguenti concetti:
- Turno operatore: comprende i dati dell'operatore e gli orari di inizio e fine turno
- Ordine di produzione: "vanno fatte x unità del prodotto y entro il giorno z per il cliente q".
Poichè per portare a termine un dato ordine di produzione può volerci metà di un turno come possono volerci 3 turni, avrei introdotto il concetto di
- Sprint di produzione: "l'operatore tizio, dalle ore x alle ore y (sottoinsieme del turno z), lavora all'ordine di produzione q".

Già qui si pone un primo problema: lato client prevedo tre schermate:
- Sprint di produzione in corso
- Ordine di produzione in corso
- Tuno in corso
, che mostrano i dati aggregati in modo differente. Per la schermata Sprint di produzione in corso torna bene avere un oggetto Sprint Di Produzione che, oltre ai dati sullo sprint (velocità media, quantitivi prodotti etc), abbia un riferimento all'ordine di produzione per il quale si sta lavorando, in modo da poter mostrare anche le informazioni riguardo alla scadenza dell'ordine etc.
Nella schermata Ordine di produzione in corso torna bene avere un oggetto ordine di produzione che contenga, oltre ai suoi dati, la lista degli Sprint Di Produzione nei quali si è lavorato a tale ordine. Questo per poter prelevare informazioni aggregate quali ad esempio velocità media tenuta nel corso di tutti gli sprint di produzione che hanno concorso a questo ordine

Analogamente avviene fra Turno e Sprint Di Produzione. Questo mi porta a dei riferimenti circolari, che immagino siano da evitare, ma soprattutto non vorrei mi creasse poi problemi quando vado a serializzare/deserializzare l'oggetto per scambiarlo fra client e server.

Sopra ho fatto un esempio, ma situazioni analoghe mi accadono in più punti, nella struttura del sistema.

Sapreste darmi qualche consiglio in merito?

Grazie,
Alessandro

5 Risposte

  • Re: Modellare contesto evitando riferimenti circolari ASP.NET Core 6

    Alkasel ha scritto:


    Questo mi porta a dei riferimenti circolari, che immagino siano da evitare, ma soprattutto non vorrei mi creasse poi problemi quando vado a serializzare/deserializzare l'oggetto per scambiarlo fra client e server.
    Il serializzatore deve essere configurato per NON "addentrarsi" all'interno della gerarchia di oggetti oltre a un determinato livello precostituito di profondità.

    Alkasel ha scritto:


    Sapreste darmi qualche consiglio in merito?
    Se il serializzatore non è configurabile, le azioni possibili dipendono dal tool che usi come ORM.
    Ad esempio, usando EF (ma anche su altri tool) puoi .

    In breve, invece di consentire a EF di caricare gli oggetti correlati in automatico, effettui manualmente l'inclusione (quindi la join) dei dati che ti occorrono nella fase di recupero degli oggetti.

    Ciao!
  • Re: Modellare contesto evitando riferimenti circolari ASP.NET Core 6

    Ciao, intanto grazie per la risposta.

    In realtà non uso EntityFramework bensì uso Npgsql per fare le query e poi creo manualmente gli oggetti C# a partire dai dataset restituiti dalle query. Di conseguenza il mapping lo faccio come mi sembra opportuno: di base seguo la struttura dell'oggetto sul DB ma ad esempio quando una tabella ha un campo che è chiave esterna in un'altra tabella, spesso all'interno dell'oggetto c# rappresento tale campo semplicemente con un riferimento all'oggetto "verso" il quale avevo una chiave esterna.

    [/quote]
    Il serializzatore deve essere configurato per NON "addentrarsi" all'interno della gerarchia di oggetti oltre a un determinato livello precostituito di profondità.
    [/quote]

    Quindi dici che avere delle dipendenze circolari può andar bene in un caso del genere e non sia necessariamente un male?

    Grazie,
    Alessandro
  • Re: Modellare contesto evitando riferimenti circolari ASP.NET Core 6

    Alkasel ha scritto:


    In realtà non uso EntityFramework bensì uso Npgsql per fare le query e poi creo manualmente gli oggetti C# a partire dai dataset restituiti dalle query.
    Non conosco questa libreria/framework, ma se gli oggetti C# sei tu a crearli, puoi decidere tu fino a quando "inoltrarti" nell'alberatura degli oggetti che produci a seguito della query.

    Alkasel ha scritto:


    Quindi dici che avere delle dipendenze circolari può andar bene in un caso del genere e non sia necessariamente un male?
    In genere, in EF ma anche in altri ORM, il problema non è nelle "dipendenze circolari" quanto più nella loro risoluzione a runtime.

    Mi spiego peggio. Se hai un oggetto che fa riferimento ad un altro oggetto (o ad una lista di altri oggetti), questo in genere non è un problema; se gli oggetti della lista contengono di nuovo un riferimento all'oggetto originale, occorre determinare se questo è lecito in quanto, in fase di serializzazione, questo verrà serializzato due volte... una volta al primo livello e una volta all'ultimo.

    In genere, il problema vero si riscontra quando i valori di queste "proprietà di navigazione" (cioè proprietà di un oggetto che caricano dinamicamente l'elemento della tabella correlata, il quale contiene altre proprietà che caricano di nuovo l'oggetto di partenza, e così via) vengono gestite automaticamente dal framework/ORM di turno: esso non è in grado di fermarsi da solo e recupera in cascata tutti gli oggetti e le loro dipendenze, e se i secondi fanno riferimento ai primi, il giro prosegue praticamente all'infinito, fino al sollevamento di una eccezione appropriata.

    In conclusione, se invece i dati li carichi tu, puoi decidere in quel momento quanto scendere nella gerarchia a seconda dell'operazione: nel momento in cui il serializzatore trova un oggetto che referenzia un altro, caricherà anche quest'ultimo, e se quest'ultimo ne dovrebbe referenziare un altro ancora, oppure quello di partenza, deve essere valorizzato a null affinché il serializzatore si fermi.

    Ciao!
  • Re: Modellare contesto evitando riferimenti circolari ASP.NET Core 6

    Chiarissimo, ti ringrazio molto!

    (citando il , Npgsql is an open source ADO.NET Data Provider for PostgreSQL)
  • Re: Modellare contesto evitando riferimenti circolari ASP.NET Core 6

    Alkasel ha scritto:


    (citando il , Npgsql is an open source ADO.NET Data Provider for PostgreSQL)
    Questo me lo guarderò senz'altro: al momento non ho richieste su PostgreSQL ma... non si sa mai.
    Inoltre, ha anche il supporto per Entity Framework (sia versione "classica" che Core) che non guasta.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
5 risposte