论坛是很多人提问的地方,同样很多人都会回答这个问题。
我希望当有人发布问题时,无论谁看到该问题打开该页面,并且在同一时间,如果有人为该问题给出答案,那么该答案将广泛播放给该问题页面上的所有用户。我想用signalr做这件事。
我们知道信号器有集线器,从那里我们可以定期命中数据库并获取状态并通过广播通知所有用户状态但是定期点击db可能不是好方法而不是当db将被更新然后某些东西将通知我拥抱一些数据然后拥抱会将该数据广播给该问题页面上的所有用户。
我的第一个问题是当db将被更新时我如何以编程方式知道? 第二个问题我如何从数据中获取数据从外部调用信号器集线器方法?
所以请指导我如何在没有轮询技术的情况下更新数据库,而我想要在更新数据库时自动将更新的数据推送到信号器集线器?
另一个重要的问题是如何通过数据或传递参数从外面通知信号器集线器?如果可能的话,用一些示例代码详细讨论。感谢
答案 0 :(得分:2)
第一部分:我会创建一个集线器,然后每个问题都会有一个信号器group。因此,每当有人打开一个问题时,它就会连接到该组。因此集线器可以通知读者。
第二部分:您需要通知集线器有关该事件的信息,以便通知订阅者。我不会用数据库轮询来做这件事。从您的域层使用事件代理,每当有新帖子发送到存储库时(我不完全知道您的架构),您可以针对此提出域事件,您可以订阅它并转发到集线器。
当我这样做时,我在App_Start运行时从静态配置类订阅我的域事件,从静态订阅者通过GlobalHost.ConnectionManager.GetHubContext<T>()
msdn
因此通知流程为:
更新这里有一篇关于吉米·博加德此类域名事件使用情况的精彩文章:link
但为了简单起见:您基本上在您的域(保存答案)和集线器通知系统之间放置一个中介,因此您可以通用方式将它们分离。中介可以像静态类一样简单(虽然我通常使用环境上下文)。该事件基本上是使用我们的自定义参数调用此静态类,并且调解器应该通知订阅者它也可以像T -> Action<T>
映射一样简单。
一个非常基本的例子:
public static class EventBrokerExample
{
private static ConcurrentDictionary<Type, List<object>> _subscriptions =
new ConcurrentDictionary<Type, List<object>>();
public static void Subscribe<T>(Action<T> callback)
{
_subscriptions.AddOrUpdate(typeof(T), new List<object> { callback },
(type, list) => new List<object>(list) { callback } );
}
public static void Send<T>(T message)
{
List<object> subscribers;
if (_subscriptions.TryGetValue(typeof(T), out subscribers))
{
foreach (Action<T> subscriber in subscribers)
subscriber(message);
}
}
}
您可以使用某些启动代码中的EventBrokerExample.Subscribe<SaveAnswerMessage>(handler)
,然后在保存新答案时使用域中的EventBrokerExample.Send(new SaveAnswerMessage())
。