Archiviazione astratta di dati per classe in base all'ambiente (web / windows)

StackOverflow https://stackoverflow.com/questions/643987

  •  22-07-2019
  •  | 
  •  

Domanda

Ho una classe e la memorizzazione delle sue informazioni dipenderà se viene consumata da un'applicazione web o windows. Stavo per usare il modello di fabbrica per distribuire l'oggetto corretto. Immagino che il chiamante memorizzerebbe l'oggetto in modo appropriato se non volessi ricreare l'oggetto. Qualcuno ha altri suggerimenti su come sottrarre l'archiviazione dei dati in base alla piattaforma?

Ad esempio, voglio archiviare i dati come variabili locali quando vengono richiamati dall'app di Windows (inviando la sottoclasse appropriata) e salvarli in Sessione quando vengono richiamati dall'app Web.

È stato utile?

Soluzione

Come dice sgreeve, la separazione delle preoccupazioni è qualcosa da tenere in considerazione per ottenere un codice gestibile.

Utilizzando un'idea del repository, l'app Winform e l'app Web potrebbero iniettare il proprio provider di archiviazione. Tali provider potrebbero condividere alcune logiche comuni se necessario per eredità o composizione.

public class MyClassRepository
{
    IStorageProvider _provider;
    public MyClassRepository(IStorageProvider provider)
    {
        _provider = provider;
    }

    public void Save(MyClass o)
    {
        _provider.Save(o);
    }

    public MyClass GetBy(string id)
    {
        return _provider.GetBy(id);
    }
}

L'app Winforms invocherebbe l'archiviazione tramite:

var provider = new WindowsStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);

e l'app Web:

var provider = new WebStorageProvider();
var rep = new MyClassRepository(provider);
rep.Save(myClassObject);

Altri suggerimenti

Non mi sembra che il modello Factory sia una soluzione al problema che hai. Lo schema Factory ha lo scopo di fornire un'istanza di un particolare sottotipo di una classe, proteggendo il chiamante della factory da (a) il sottotipo reale che viene restituito, e (b) la logica utilizzata dalla factory per decidere quale sottotipo restituire.

Questo non è quello che ti serve qui. Penso che sia necessario estrarre l'archiviazione dei dati dalla classe che modella i dati archiviati.

Hai una classe comune a due applicazioni e ognuna di queste applicazioni dovrebbe implementare funzionalità per archiviare i dati incapsulati dalla tua classe in un modo appropriato per quella applicazione. Ciò implica due cose:

  1. Ogni applicazione (modulo web e windows) dovrebbe contenere funzionalità per fare in modo che venga archiviata via i dati - ma nessuna delle due deve includere il codice usato dall'altra. per esempio. l'app per moduli Windows non deve sapere come archiviare i dati in una sessione Web. Pertanto, il codice che archivia i dati in una sessione Web deve trovarsi in un oggetto che fa parte dell'app Web ma non parte dell'app Windows Form e viceversa.

  2. Dato che questo è il caso, e dato che la classe i cui dati stai archiviando deve essere comune a entrambe le app, quella logica di archiviazione non può far parte di quella classe. (Seguendo i principi di progettazione OO accettati, quella classe non dovrebbe comunque sapere come archiviarsi in diverse parti dell'applicazione, poiché ciò introduce dipendenze che rendono difficili le modifiche future. Vedi Principio di responsabilità singola ...)

Spero che sia utile

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top