Non c'è niente da fare intorno dover digitare le nuove informazioni da qualche parte; la chiave è farla uscire dal codice, per evitare di ricompilare e ridistribuire per un cambiamento così banale.
Alcune buone opzioni sono elencare questi valori in un file di configurazione XML, o, meglio ancora, nel database.
Probabilmente vorrai compilare un dizionario con questi dati, qualunque sia la fonte. Questa volontà:
- Lo rendono facile da memorizzare nella cache
- rendono pulito, codice veloce
Quando arriva il momento di tirare i dati di configurazione in codice, che ci si aggiungono elementi Dizionario in questo modo:
Dictionary<string, IReportCreator> = configDataGetter.GetReportDataFromDB().
ToDictionary(r => r.Name, myReportCreatorFactory(r => r.ReportID))
Questo esempio presuppone i dati ottenendo come oggetto entità di qualche tipo, e l'utilizzo di una fabbrica che userebbe un strategy pattern per il vostro codice che crea RELAZIONE ts. C'è un sacco di modi in cui potresti farlo naturalmente.
Immagino che i report siano troppo estesi, vari e di natura diversa che non è possibile inserire solo sql e il building block di stile nel db?
Modifica sulla base di commenti di OP:
Ah, Gotcha. Beh, non so quanto tempo hai, ma tanto quanto puoi spingere tutto in una sorta di factory, hai opzioni migliori che avrai in seguito. Ho intenzione di darti alcuni pensieri che, si spera, aiuteranno, da cose simili che ho fatto. Ogni passaggio è un miglioramento in sé, ma anche un piccolo passo per separare davvero la logica del report da questo codice shell. Inoltre, posso vedere che sai già cosa stai facendo e sono sicuro di sapere cosa dirò di seguito, ma non so cosa tu sappia e sarà utile per gli altri.
Prima di tutto, estrai qualsiasi bit di informazioni dal codice a db (se non lo hai già fatto) e aggiungerai altri campi DB (e una tabella o due) mentre migliori la tua configurazione.
Forse lo sapete già, ma lo menzionerò per altri, per verificare lo schema di strategia di cui sopra. È possibile avere la logica personalizzata di ciascuna "funzione di report" effettivamente nel costruttore delle varie classi di strategia. Verrebbero tutti ereditati dal proprio ReportGenerator di base (o dotati di un'interfaccia IReportGenerator comune). Possono e dovrebbero condividere lo stesso costruttore; i vari parametri del rapporto verrebbero gestiti da un parametro del dizionario dei tipi. L'implementazione del costruttore di ogni classe dovrebbe sapere che i tipi di variabili sono necessari (dalla configurazione di db) e li casterebbe/li userà di conseguenza.
Il passaggio successivo potrebbe essere quello di eliminare davvero l'istruzione selezionata in fabbrica, utilizzando reflection. Dovresti avere il nome della classe come parte dei dati di configurazione dei report nel db (e avere un costruttore comune).
A questo punto, il modo per aggiungere un nuovo report è abbastanza pulito, anche se devi aggiungere una nuova classe ogni volta. Bene. Soddisfa i principi single responsibility e open-closed.
Ora, c'è solo il passaggio finale di rimuovere le classi dall'app, in modo che possano essere aggiunte/modificate al volo. Controlla MEF. Questo è ciò per cui è fatto. Alcune cose che potresti trovare su Internet che probabilmente non dovresti usare sono CodeDom (ottimo quando non c'era nient'altro, ma MEF è meglio) e le funzioni di compilazione-come-servizio che arrivano in .NET 5. MEF è la strada da percorrere
Si potrebbe considerare l'utilizzo di un database per memorizzare i valori e scrivere una query che ottenga ciò di cui si ha bisogno. Quindi tutto ciò che devi fare è inserire i dati con ogni nuovo rapporto. – northpole
@northpole - Non sono sicuro se capisco. I valori sono basati sulle selezioni dell'utente dalle pagine che hanno chiamato a ReportController. –
si riferiscono alla risposta di Patrick Karcher. Fondamentalmente, è ancora necessario gestire la selezione dell'utente, tuttavia, si mette la mappatura alla selezione nel database. Quindi hai un metodo che risponde a un tipo. Il metodo raccoglie ciò di cui ha bisogno dal DB (che tipo di report è e che report deve essere compilato) e crea il report di conseguenza. – northpole