论坛是很多人问问题的地方,很多人都是这样回答问题的。
我希望,当有人发表问题时,不管是谁看到这个问题打开了那一页,同时如果有人给出这个问题的答案,那么这个答案将被广泛应用于所有在该问题页上的用户。我想和signalr一起做。
我们知道signalr有集线器,从那里我们可以定期访问数据库并通过广播获取状态并通知所有用户,但是定期访问db可能不是一种好的方法,相反,当db将被更新时,有东西会用一些数据通知我的拥抱,然后拥抱会将该数据广播给该问题页面上的所有用户。
我关注的第一个问题是什么时候更新db,如何以编程方式知道?第二个问题是如何从外部调用signalr方法和从db获取数据?
因此,请指导我如何知道什么时候数据库更新,而没有轮询技术,我想要的东西,将更新的数据推送到signalr集线器自动时,数据库更新?
另外一个重要的问题是如何用数据或传递参数从外部通知signalr集线器?如果可能的话,请与一些示例代码进行详细讨论。谢谢
发布于 2014-02-17 15:09:09
第一部分:我会创建一个集线器,然后对于每个问题都会有一个signalr 组。因此,每当有人提出一个问题时,它就会与那个群体联系起来。这样集线器就能通知读者。
第二部分:您需要将事件通知集线器,以便它能够通知订阅者。我不会用db轮询来做这件事。使用事件代理,而不是从您的域层,每当一个新的帖子被发送到存储库(我不确切地知道您的架构),您可以引发一个域事件,您可以订阅它并转发到集线器。
当我这样做时,我从运行App_Start的静态配置类和从静态订阅者订阅域事件,然后通过GlobalHost.ConnectionManager.GetHubContext<T>() msdn进入signalr
因此,通知流程是:
Update是Jimmy:链接中关于这种域事件使用的一篇很棒的文章。
但是,简单地说:您基本上在域(保存答案)和集线器通知系统之间放置了一个中介,所以您可以以通用的方式将它们解耦。中介可以像静态类一样简单(尽管我通常使用环境上下文)。事件基本上是用我们的自定义参数调用这个静态类,中介应该将它通知订阅者,这也可以像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())。
https://stackoverflow.com/questions/21830669
复制相似问题