Sono uno sviluppatore junior (penso all'esperienza di livello interno) che lavora in un piccolo negozio più o meno da solo su un progetto che consuma dati da un database, lo elabora e inserisce i risultati in un altro database. La soluzione è un servizio di Windows scritto in C #.
Una versione precedente della soluzione utilizzava App.config
per cose come stringhe di connessione, intervalli di tempo per controllare il db per i nuovi dati, ecc. Il project manager desidera che queste informazioni siano memorizzate in una tabella nel db, e quindi avere un singleton che mantenga quei dati piuttosto che aver bisogno di accedere al file di configurazione. I dati di configurazione devono essere caricati all'avvio.
La mia attuale implementazione ha il costruttore del singleton che effettua una singola chiamata a getConfig()
, un metodo che incapsula il lavoro di ottenere tutti i dati dal db. Siamo ora in procinto di scrivere il codice che controllerà il db all'avvio per assicurarsi che quelle tabelle di configurazione siano presenti e le costruirà se non lo sono.
Ho diverse incertezze sul design:
1) Costruire la configurazione nel costruttore è il posto migliore in modo che il lavoro sia implicito:
protected override void OnStart(string[] args)
{
// The first call for an instance, so the object is created & data is loaded
ConfigSingleton MyConfig = ConfigSingleton.GetInstance;
// Create object that checks db for data to process; relies on config
Poller = new Poller();
Poller.Start();
}
o dovrei effettuare una chiamata pubblica esplicita a getConfig()
durante l'avvio per maggiore chiarezza:
protected override void OnStart(string[] args)
{
ConfigSingleton MyConfig = ConfigSingleton.GetInstance;
MyConfig.getConfig(); // Explicit call to get config from db
// Create object that checks db for data to process; relies on config
Poller = new Poller();
Poller.Start();
}
2) Il lavoro per controllare le tabelle di configurazione dovrebbe essere fatto da una classe separata, presumibilmente statica:
protected override void OnStart(string[] args)
{
if (!DBChecker.isTableReady())
{
DBChecker.BuildTables();
}
ConfigSingleton MyConfig = ConfigSingleton.GetInstance;
MyConfig.getConfig();
// Create object that checks db for data to process; relies on config
Poller = new Poller();
Poller.Start();
}
o dovrebbe essere gestito internamente dal singleton di configurazione, quindi il codice apparirebbe come una delle varianti sopra?
Un esempio un po 'non correlato che aiuta a chiarire lo spirito della mia domanda proviene da una versione precedente della soluzione (che ho parafrasato):
// Inside this function, a call is made to BusinessLayer.GetList1()
MyController = new Controller(FirstParam);
MyController.Start();
// Yet here, a similar version is called first and then the result is passed as a parameter
List<Objects> MyList2 = BusinessLayer.GetList2();
MySender = new Sender(SecondParam, MyList2);
MySender.Start();
Ci sono delle regole di base che governano quando il lavoro dovrebbe essere svolto all'interno di un altro lavoro, o al di fuori, passato come parametro, ecc, a parte il fatto ovvio che dovrebbe essere almeno coerente?