Domanda

Prendi un'app .Net Winforms..mescolare una connessione di rete wireless instabile, mescolare con alcuni utenti a cui piace semplicemente staccare la spina blu di tanto in tanto e per buona misura, aggiungere un amministratore di sistema che decide di riavviare la scatola del server SQL senza preavviso di tanto in tanto solo per tenere tutti attivi le dita dei piedi.

Quali sono i suggerimenti e le strategie per gestire questo tipo di scenario rispetto a:

  • Gestione degli errori - Ad esempio, avvolgi ogni chiamata al server con un tentativo/cattura o fai affidamento su una forma di gestione di errori generici per gestire questo?Se sì, che aspetto ha?

  • Gestione delle applicazioni - Ad esempio, si disabilita l'app e non consenti agli utenti di interagire con essa fino a quando non viene rilevata una connessione?Cosa faresti?

È stato utile?

Soluzione

La risposta dipende dal tipo di domanda.Esistono applicazioni che possono funzionare offline, ad esempio Microsoft Outlook.Tali applicazioni non considerano critiche le eccezioni di connettività, possono salvare il tuo lavoro localmente e sincronizzarlo in seguito.Altre applicazioni, come i giochi online, tratteranno il problema di comunicazione come un'eccezione critica e si chiuderanno se la connessione viene persa.

Per quanto riguarda la gestione degli errori, penso che dovresti controllare le eccezioni su tutti i livelli piuttosto che fare affidamento su qualche pezzo di codice generale per la gestione delle eccezioni.Il tuo livello aziendale dovrebbe capire cosa è successo al livello inferiore (livello di accesso ai dati nel nostro caso) e rispondere di conseguenza.La perdita di connessione non dovrebbe essere trattata come eccezione inaspettata secondo me.Per le buone pratiche di gestione delle eccezioni consiglio di dare un'occhiata a Blocco applicazione gestione eccezioni.

Per quanto riguarda il comportamento dell'applicazione, dovresti rispondere a te stesso nella seguente domanda "La mia applicazione ha un valore commerciale per i clienti nello stato disconnesso?" In molti casi sarebbe utile per l'utente finale essere in grado di continuare il proprio lavoro in stato disconnesso.Tuttavia tale comportamento è tremendamente difficile da implementare.

Soprattutto per il tuo scenario sviluppato da Microsoft Blocco applicazione agente di servizio disconnesso

Altri suggerimenti

Non tocco WinForms e .NET ormai da anni, quindi non posso fornirti alcun dettaglio tecnico, ma c'è la risposta con un'immagine più ampia:

Innanzitutto: non associare i dati del modulo direttamente a un database.

Crea un livello dati/modello separato a cui associare i widget del modulo.

Da lì in poi, avrai a disposizione diverse opzioni a seconda del livello di stabilità e disponibilità che devi fornire.

Probabilmente una delle soluzioni più semplici sarebbe quella di abilitare/disabilitare semplicemente le parti dell'applicazione che devono interagire con un database in base allo stato della connessione.

Il livello successivo di protezione includerebbe la memorizzazione nella cache locale di parte del modello dati e mentre la connessione al database non è attiva, l'utilizzo della cache locale per visualizzare e disabilitare qualsiasi funzione che richieda una connessione esplicita al database.

Probabilmente la cosa più complicata (che potrebbe anche fornire un'esperienza più stabile all'utente finale) è replicare il database localmente e utilizzare una sorta di schema di sincronizzazione per mantenere la copia del database sincronizzata con il database remoto.

Questo potrebbe essere un po' pure molto supporto per lo scenario offline, ma hai considerato il "Microsoft Sync Framework"?Nel framework è incluso "Sync Services for ADO.NET 2.0", che consente alla tua applicazione di raggiungere un'istanza locale di SQL Server CE.Questo può essere facilmente sincronizzato con un SQL Server centrale tramite una varietà di metodi.

Questo framework gestisce lo scenario offline permanente e, come ho detto, potrebbe non essere appropriato per le tue esigenze specifiche, tuttavia fornirà alla tua applicazione un solido supporto offline.

Abbiamo questo nel nostro Main() metodo che intrappola tutte le eccezioni non gestite...

Application.ThreadException += new 
System.Threading.ThreadExceptionEventHandler(UnhandledExceptionCatcher);

Thread.GetDomain().UnhandledException += new 
UnhandledExceptionEventHandler(Application_UnhandledException);

poi Application_UnhandledException E UnhandledExceptionCatcher visualizzare messaggi intuitivi.

Inoltre, l'applicazione invia tramite e-mail dati come lo stack trace agli sviluppatori, il che può essere molto utile.

Ovviamente dipende dall'app, ma per il tipo di errori che descrivi chiuderei l'app.

Nella nostra applicazione, diamo all'utente la possibilità di connettersi a un altro server, ad esempio, se la connessione al database fallisce, viene visualizzata una finestra di dialogo che dice che il server non è disponibile e può inserire un altro indirizzo IP da provare.

Usa qualcosa di simile SQLite per archiviare i dati offline finché non è disponibile una connessione.

Aggiornamento:Credo che SQLite sia il back-end per Google Gears, che da quanto ho capito fa quello che stai cercando nelle app web...anche se non so se può essere utilizzato in un contesto non web.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top