【问题标题】:SQL Dependency and SignalR in a 3 Tiered Architecture3 层架构中的 SQL 依赖关系和 SignalR
【发布时间】:2016-01-06 15:30:20
【问题描述】:

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

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

我们选择使用 SQL Dependency 和 SignalR 作为我们的解决方案。

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

我能想到的唯一解决方案是使用 SQL Dependency 来跟踪更改,将它们转储到某个表/对象中,然后使用轮询从控制器获取这些更改,到 biz 层,到数据层,然后返回向上。

  • 问题 #1:有更好的解决方案吗?
  • 问题 #2:包含业务层逻辑但仍能够跟踪数据层更改的最佳解决方案是什么?
  • 问题 #3:如果不进行轮询,这是否可行?

【问题讨论】:

    标签: c# asp.net sql-server signalr sqldependency


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这不能解决我的问题,因为这种类型的代码/逻辑不应该在业务级别。业务级别不应该知道架构涉及的任何内容,并且应该只在 DTO 上工作。
      • 目的是什么?因此,您可以坐下来欣赏您维护 3 层概念,而牺牲了解决方案?我们使用这些工具来解决问题。并不是每个问题都适合我们这十年都喜欢的设计模式的最新理念。你有一个解决方案,所以你模糊了你的控制器和业务层。大不了。只需阻止视图或最终用户直接访问数据,您仍然是黄金。
      猜你喜欢
      • 2012-03-15
      • 2015-01-09
      • 2014-06-05
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多