L'applicazione My C# server.exe
è fondamentale per le operazioni aziendali e deve essere eseguita senza interruzioni 24 ore su 24, 7 giorni su 7. Il codice è solido, ma una cosa fuori dal mio controllo è la scarsa qualità dei feed di dati in ingresso generati da terze parti. Io occasionalmente ricevere feed di dati che contengono anomalie nel qual caso deve:Come posso caricare una parte della mia app C# in modo dinamico senza riavvio dell'app?
- aggiornamento del codice di trasformazione degli alimenti all'interno
server.exe
per accogliere l'anomalia - ricompilazione
- riavvio
server.exe
utilizzando il nuovo codice e consentire la sintatticamente mangimi viziata da lavorare
l'intero processo di solito richiede meno di un paio di minuti, ma il riavvio server.exe
provoca l'azzeramento di alcune informazioni di stato non critiche e peggio, provoca una perturbazione di processi esterni che dipendono da server.exe.
Il mio obiettivo: isolare il codice trasformazione degli alimenti in una DLL separata il cui contenuto può essere aggiornato senza riavviare server.exe
. Come posso fare questo?
Permettetemi di spiegare ciò che ho fatto finora prima di scrivere questo post sul forum: interfaccia processore
Il feed è stato spostato in un nuovo gruppo chiamato common.dll
. L'interfaccia simile a questa:
public interface IFeedProcessor{
bool ProcessFeed(String filePath); //returns false on failure, true on success
}
Server.exe
ora fa riferimento common.dll
.
Gli stessi processori di alimentazione sono stati spostati in un nuovo assieme denominato feedProcessors.dll
. Le implementazioni sono qualcosa del tipo:
internal class FeedProcessor1:IFeedProcessor{
public FeedProcessor1(){}
bool ProcessFeed(String filePath){/*implementation*/return true;}
}
internal class FeedProcessor2:IFeedProcessor{
public FeedProcessor2(){}
public bool ProcessFeed(String filePath){/*implementation*/return true;}
}
[... and so on...]
feedProcessors.dll
contiene anche una classe denominata FeedProcessorUtils
che viene utilizzato per creare una specifica processore di alimentazione sulla base di alcuni input di configurazione. Assomiglia a questo:
public class FeedProcessorUtils{
public static void CreateFeedProcessor(int feedType /*and other configuration params*/){
switch(feedType){
case 1:return new FeedProcessor1();
case 2:return new FeedProcessor2();
default: throw new ApplicationException("Unhandled feedType: "+feedType);
}
}
}
Tutto funziona come prima ma ovviamente non risolve il mio problema di caricamento dinamico; Se ho aggiornato feedProcessors.dll
con un nuovo codice e lo ho copiato sul server di produzione, non riesco a farlo perché il file è in uso. Nessuna sorpresa lì. Quindi qual è la soluzione?
Idealmente, voglio essere in grado di copiare un feedProcessors.dll
aggiornato sul server di produzione senza un errore di file in uso e senza riavviare server.exe
. Quindi, la volta successiva che server.exe
effettua una chiamata a FeedProcessorUtils.CreateFeedProcessor(), verrà eseguito dalla mia DLL modificata anziché anziché vecchia.
Da dove iniziare?
Stai cercando [MEF] (http://msdn.microsoft.com/en-us/library/dd460648 (v = vs.110) .aspx) –