Alternativa alla riflessione

4

Verrò direttamente al flusso di lavoro corrente in modo che tu possa capire il problema in un'immagine chiara.

Sono collegato al sistema di automazione di laboratorio in cui Analyzer (una macchina che esegue test medici) invia i dati a Host (il nostro sistema di automazione). Ad ogni analizzatore viene assegnato un ID univoco (ID macchina) e viene salvato nel Database con il percorso completo del relativo controller. Un controller è una semplice classe Java che mantiene la connessione tra Analyzer e Host.

Ora quel controller (una classe java) viene istanziato in fase di esecuzione quando l'utente accende il nostro software. L'utente fornisce l'id della macchina e in base all'ID della macchina, il relativo controller viene istanziato. Il controller viene istanziato utilizzando Riflessioni che è il PROBLEMA qui. Stiamo cercando una soluzione per evitare l'uso di Reflection.

In aggiunta alla complessità, abbiamo più Analizzatori dello stesso tipo, il che significa che avremo lo stesso Controller per ogni Analizzatore dello stesso tipo. In altre parole, se abbiamo 5 analizzatori identici, il nostro programma userà Reflections per creare la sua istanza.

Spero di aver chiarito il mio punto, quale approccio è il miglior sostituto di Reflections? Si noti che conosco i modelli di progettazione e tutte le cose, ma probabilmente nessuna di queste ha risolto il mio problema e ci stiamo ancora affidando a Reflections.

Grazie, fammi sapere se sono necessarie ulteriori informazioni.

    
posta Faizan Mubasher 05.09.2018 - 11:03
fonte

1 risposta

2

Usa il modello di fabbrica

class ControllerFacatory 
{
    private Dictionary<string,string> ControlerTypeLookup
    public Controller Get(string machineId)
    {
         if(ControlerTypeLookup[machineId] == "SuperAnalyser")
         {
             return new SuperAnalyser();
         }...
    }
}

Inoltre, se hai già un framework DI puoi fare cose come

container.RegisterType<Controller, SuperAnalyser>("SuperAnalyser");
container.Resolve<Controller>("SuperAnalyser");

che essenzialmente fa la stessa cosa.

Non sono chiaro se utilizzare lo stesso controller da più macchine sia un comportamento desiderato o meno? in entrambi i casi è possibile regolare il comportamento, sia mettendo direttamente in cache il Controller in fabbrica, sia attraverso le opzioni che il contenitore DI di propria scelta offre.

    
risposta data 05.09.2018 - 12:14
fonte

Leggi altre domande sui tag