三层体系结构中的SQL依赖关系和SignalR

本文关键字:依赖 SQL 关系 SignalR 三层 体系结构 | 更新日期: 2023-09-27 18:29:15

我们有一个web应用程序,它由一个带UI的3层后端(Controller/Biz/Data)组成。我们的数据层只负责从数据库实例(SQL)中提取数据,业务层向数据发送消息并创建派生属性,控制器负责将这些更改发送到UI。

我们需要在应用程序中进行实时更新,这些更新必须在数据库级别(而不是控制器级别)进行跟踪。

我们选择使用SQL依赖关系和SignalR作为我们的解决方案。

我所研究的关于SignalR和SQL依赖关系的一切都在数据库级别,SQL依赖关系将在数据层中识别更改和广播。由于显而易见的原因,这种方法将绕过在业务层中创建的派生属性,并为我们提供一个外观不同的对象。

我能想到的唯一解决方案是使用SQL依赖项来跟踪更改,将它们转储到某个表/对象中,然后使用轮询从控制器、业务层、数据层获取这些更改,然后进行备份。

  • 问题1:有更好的解决方案吗
  • 问题2:包含业务层逻辑,但仍然能够跟踪数据层的更改的最佳解决方案是什么
  • 问题3:在没有轮询的情况下,这可能吗

三层体系结构中的SQL依赖关系和SignalR

您的数据层正在捕获数据库引发的事件。让它将数据映射到适当的DTO中,然后引发一个由业务层捕获的事件。然后,业务层可以向视图层引发一个事件,视图层可以执行SignalR Broadcast()。冒泡!

SqlDependency会在您跟踪的数据库中留下垃圾,并且不会自行清理。避免使用它!请改用开源实现-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();

使用上面提到的组件,您甚至可以跟踪实际更改的数据,这些数据可以从事件处理程序的事件参数中获得。希望这能有所帮助。