2016-01-06 18 views
5

Abbiamo un'applicazione Web che consiste in un back end a 3 livelli (Controller/Biz/Data) con un'interfaccia utente. Il nostro livello dati è l'unico responsabile per estrarre i dati dall'istanza del database (SQL), i messaggi del livello aziendale i dati e creare proprietà derivate, il controllore è responsabile dell'invio di tali modifiche all'interfaccia utente.Dipendenza SQL e SignalR in un'architettura a 3 livelli

Abbiamo bisogno di avere aggiornamenti in tempo reale nella nostra applicazione che DEVONO essere tracciati a livello di database (non a livello di controller).

Abbiamo optato per utilizzare SQL Dependency e SignalR come nostra soluzione.

Tutto ciò che ho cercato su SignalR e SQL Dependency è a livello di database, dove la dipendenza SQL identificherà la modifica e la trasmissione, tutto all'interno del livello dati. Per ovvi motivi questa metodologia aggirerebbe le proprietà derivate create nel livello aziendale e ci darà un oggetto dall'aspetto diverso.

L'unica soluzione a cui posso pensare è utilizzare la dipendenza SQL per tenere traccia delle modifiche, scaricarle in alcune tabelle/oggetti, quindi utilizzare il polling per recuperare quelli dal controller, al livello biz, al livello dati e backup.

  • Domanda n. 1: C'è una soluzione migliore?
  • Domanda n. 2: Qual è la soluzione migliore per includere la logica del livello aziendale, ma essere ancora in grado di tenere traccia delle modifiche nel livello dati?
  • Domanda n. 3: è possibile senza il polling?

risposta

0

SqlDependencyleaves cestino nel database tracciato e non pulisce dopo se stesso. Evita di usarlo! Utilizzare invece una realizzazione Open-Source - SqlDependencyEx. E 'abbastanza facile da configurare e utilizzare:

// See constructor optional parameters to configure it according to your needs 
var listener = new SqlDependencyEx(connectionString, "YourDatabase", "YourTable"); 

// e.Data contains actual changed data in the XML format 
listener.TableChanged += (o, e) => Console.WriteLine("Your table was changed!"); 

// After you call the Start method you will receive table notifications with 
// the actual changed data in the XML format 
listener.Start(); 

// ... Your code is here 

// Don't forget to stop the listener somewhere! 
listener.Stop(); 

Con il componente di cui sopra si può anche monitorare l'effettivo dati modificati che si possono ottenere da args evento del gestore di eventi. Spero che questo ti aiuti.

+0

Questo non risolve il problema poiché questo tipo di codice/logica non dovrebbe essere a livello aziendale. Il livello aziendale non dovrebbe sapere nulla di ciò che è coinvolto nello schema e dovrebbe funzionare solo sui DTO. – mtsuggs

+0

Per quale scopo? Quindi puoi sederti e ammirare che hai mantenuto il concetto a 3 livelli, a scapito di una soluzione? Usiamo questi strumenti per risolvere i problemi. Non tutti i problemi si adattano all'ultima idea di schemi di progettazione che tutti apprezziamo in questo decennio. Hai una soluzione, quindi confondi un po 'il controller e il livello aziendale. Grande affare. Basta mantenere la vista o l'utente finale dall'accesso diretto ai dati e sei ancora d'oro. – Jason

1

Il livello dati sta intercettando gli eventi generati dal database. È necessario associare i dati all'appropriato DTO, quindi generare un evento da catturare dal Business Layer. Il Business Layer può quindi generare un evento sul livello View, che può eseguire SignalR Broadcast(). Traboccare!