2016-01-06 4 views
5

У нас есть веб-приложение, состоящее из 3-слойного заднего конца (Controller/Biz/Data) с пользовательским интерфейсом. Наш слой данных несет полную ответственность за извлечение данных из экземпляра базы данных (SQL), бизнес-уровень передает данные и создает производные свойства, контроллер отвечает за отправку этих изменений в пользовательский интерфейс.Зависимость SQL и SignalR в трехуровневой архитектуре

У нас есть необходимость иметь обновления в реальном времени в нашем приложении, которые ДОЛЖНЫ отслеживаться на уровне базы данных (а не на уровне контроллера).

Мы решили использовать SQL Dependency и SignalR в качестве нашего решения.

Все, что я исследовал о SignalR и SQL Dependency, находится на уровне базы данных, где SQL Dependency будет определять изменения и широковещание, все в пределах уровня данных. По понятным причинам эта методология будет обходить производные свойства, созданные на бизнес-уровне, и дать нам другой перспективный объект.

Единственное решение, которое я могу придумать, - использовать SQL Dependency для отслеживания изменений, сбрасывать их в какую-либо таблицу/объект, а затем использовать опрос для извлечения данных из контроллера, уровня уровня, слоя данных и резервное копирование.

  • Вопрос №1: Есть ли лучшее решение?
  • Вопрос №2: Какое наилучшее решение включает логику бизнес-уровня, но все же можно отслеживать изменения на уровне данных?
  • Вопрос № 3: Возможно ли это без опроса?

ответ

0

SqlDependencyleaves мусор в базе данных, которую вы отслеживаете и не очищаете после себя. Избегайте использования! Вместо этого используйте реализацию с открытым исходным кодом - SqlDependencyEx. Это довольно легко настроить и использовать:

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

С компонентом упомянутой выше, вы можете даже отслеживать фактические данные изменились, которые вы можете получить от арг событий обработчика событий. Надеюсь это поможет.

+0

Это не разрешает мою проблему, так как этот тип кода/логики не должен быть на уровне бизнеса. Бизнес-уровень не должен знать ничего, связанного с схемой, и должен работать только с DTO. – mtsuggs

+0

С какой целью? Таким образом, вы можете сидеть сложа руки и восхищаться тем, что вы поддерживали концепцию 3 уровня, за счет решения? Мы используем эти инструменты для решения проблем. Не каждая проблема будет соответствовать последней идее шаблонов проектирования, которые все мы любим в этом десятилетии. У вас есть решение, поэтому вы немного размываете свой контроллер и бизнес-уровень. Большая сделка. Просто держите просмотр или конечный пользователь от прямого доступа к данным, и вы все еще золотые. – Jason

1

Ваш уровень данных захватывает события, вызванные базой данных. Предложите ли вы сопоставить данные в соответствующий DTO, а затем поднимите событие, которое должно быть уловлено бизнес-слоем. Затем Business Layer может поднять событие на слой «Вид», который может выполнять SignalR Broadcast(). Пузыриться!