Nel progetto corrente su cui sto lavorando, alcune delle classi C # vengono archiviate come codice sorgente nei record del database SQL Server ed eseguite come necessario utilizzando CSScript . Questo viene fatto in modo che il server non debba essere rimosso per sostituire l'assembly in cui risiedono queste classi.
Sebbene ciò sia sembrato una buona idea in linea di principio, i costi di questo schema hanno superato i benefici su un certo numero di livelli, e ora sto cercando altri possibili rimedi.
In passato, quando avevo bisogno di questo tipo di "late binding", ho semplicemente usato Activator.CreateInstance()
per creare un'istanza e utilizzare i tipi di cui ho bisogno. In genere, questa funzionalità viene nascosta dietro un metodo factory che utilizza un file di configurazione XML per cablare gli assembly appropriati.
Quindi, nel mio mondo perfetto, quando voglio applicare hot patch al server, copierò l'assembly sul server, modificherò il file XML per fare riferimento al nuovo assembly e quindi le istanze successive di quel tipo saranno richieste via il metodo factory, il server riceverà automagicamente le istanze dal nuovo assembly anziché quello precedente.
Detto questo, non l'ho mai provato con un sistema in esecuzione. L'ho sempre usato con un programma che non è in esecuzione, come una sorta di sistema di plugin per poveri. Sono a conoscenza di cose come MEF , ma non lo faccio sapere come si applica il MEF qui, dato che non ho mai dovuto usarlo.
La mia domanda è semplice: cosa mi manca? Non è così semplice come penso che sia? Questo fallirà perché non ho scaricato il dominio dell'app che la DLL originale da cui è stato caricato il tipo originale? Il mio algoritmo diventerà improvvisamente Skynet senza preavviso?
In breve, c'è un modo migliore?