2016-01-06 6 views
5

Mamy aplikację internetową, która składa się z 3 warstwowego zaplecza (Controller/Biz/Data) z interfejsem użytkownika. Nasza warstwa danych jest wyłącznie odpowiedzialna za wyciąganie danych z instancji bazy danych (SQL), wiadomość biznesowa warstwy danych i tworzy właściwości pochodne, kontroler jest odpowiedzialny za wysyłanie tych zmian do interfejsu użytkownika.SQL Dependency and SignalR w 3 warstwowej architekturze

Potrzebujemy aktualizacji w czasie rzeczywistym w naszej aplikacji, która MUSI być śledzona na poziomie bazy danych (nie na poziomie kontrolera).

Zdecydowaliśmy się użyć SQL Dependency i SignalR jako naszego rozwiązania.

Wszystko, co badałem na temat SignalR i zależności SQL, znajduje się na poziomie bazy danych, gdzie SQL Dependency zidentyfikuje zmianę i transmisję, wszystko w warstwie danych. Z oczywistych powodów ta metodologia pominęłaby pochodne właściwości utworzone w warstwie biznesowej i dałaby nam inny obiekt wyglądający.

Jedyne rozwiązanie, jakie mogę sobie wyobrazić to użycie zależności SQL do śledzenia zmian, zrzucenie ich do tabeli/obiektu, a następnie użycie odpytywania do pobrania tych danych ze sterownika, do warstwy biz, do warstwy danych i utworzyć kopię zapasową.

  • Pytanie nr 1: Czy istnieje lepsze rozwiązanie?
  • Pytanie nr 2: Jakie jest najlepsze rozwiązanie, aby uwzględnić logikę warstwy biznesowej, ale nadal można śledzić zmiany w warstwie danych?
  • Pytanie nr 3: Czy jest to możliwe bez odpytywania?

Odpowiedz

0

SqlDependencyleaves śmieci w bazie danych, którą śledzisz i nie czyści po sobie. Unikaj używania go! Zamiast tego użyj realizacji Open Source - SqlDependencyEx. Jest to dość łatwe do skonfigurowania i zastosowanie:

// 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(); 

Ze składnikiem wymienionym powyżej można nawet śledzić rzeczywisty zmienione dane którego można dostać się z argumentami wydarzeniem obsługi zdarzeń. Mam nadzieję że to pomoże.

+0

To nie rozwiązuje mojego problemu, ponieważ ten typ kodu/logiki nie powinien być na poziomie biznesowym. Poziom biznesowy nie powinien być świadomy czegokolwiek związanego ze schematem i powinien działać tylko na DTO. – mtsuggs

+0

Do jakiego końca? Więc możesz usiąść wygodnie i podziwiać, że utrzymałeś koncepcję 3 poziomu, kosztem rozwiązania? Używamy tych narzędzi do rozwiązywania problemów. Nie każdy problem będzie pasował do najnowszego pomysłu na wzorce projektowe, które wszyscy lubimy w tej dekadzie. Masz rozwiązanie, więc nieco zamazujesz kontroler i warstwę biznesową. Wielka rzecz. Po prostu pozostaw widok lub użytkownik końcowy z bezpośredniego dostępu do danych, a nadal jesteś złoty. – Jason

1

Twoja warstwa danych przechwytuje zdarzenia zebrane przez bazę danych. Niech mapuje dane do odpowiedniego DTO, a następnie podnosi wydarzenie, które zostanie przechwycone przez warstwę biznesową. Warstwa biznesowa może następnie podnieść zdarzenie do warstwy widoku, która może wykonać nadawanie SignalR(). Pienić!