這很容易,使您的中心靜態。或者甚至更好,在Singleton中處理所有SignalR的東西,將邏輯集中在一個地方。
一個乾淨的方法來做到這一點,是訂閱該單例中的所有服務器事件,然後使該類重新發送您的自定義事件。 Here's一個例子形成工作程序:
public event Action<string, User> OnShowMatchingInvite;
public event Action<MatchingResolutions, Conversation> OnMatchingResolution;
public event Action<string> OnPeerLeftConversation;
public event Action<ChatMessage> OnAddNewMessage;
public event Action<string, ChatMessageStatus> OnConfirmMessageDelivered;
public event Action<string> OnConfirmMessageReceived;
public event Action<string> OnConfirmMessageRead;
public event Action<UserChatStatus> OnChangeUserChatStatus;
public event Action<string> OnConversationKilled;
private void ProxySubscriber(IHubProxy hubProxy)
{
hubProxy.On<string, User>(Settings.HubListenerShowMatchingInvite,
(matchingUid, peer) => OnShowMatchingInvite?.Invoke(matchingUid, peer));
hubProxy.On<MatchingResolutions, Conversation>(Settings.HubListenerHandleMatchingResolution,
(resolution, conversation) => OnMatchingResolution?.Invoke(resolution, conversation));
hubProxy.On<string>(Settings.HubListenerPeerLeftConversation,
conversationId => OnPeerLeftConversation?.Invoke(conversationId));
hubProxy.On<ChatMessage>(Settings.HubListenerAddNewMessage,
message => OnAddNewMessage?.Invoke(message));
hubProxy.On<string, ChatMessageStatus>(Settings.HubListenerConfirmMessageDelivered,
(messageUid, status) => OnConfirmMessageDelivered?.Invoke(messageUid, status));
hubProxy.On<string>(Settings.HubListenerConfirmMessageReceived,
uid => OnConfirmMessageReceived?.Invoke(uid));
hubProxy.On<string>(Settings.HubListenerConfirmMessageRead,
uid => OnConfirmMessageRead?.Invoke(uid));
hubProxy.On<UserChatStatus>(Settings.HubListenerChangeUserChatStatus,
status => OnChangeUserChatStatus?.Invoke(status));
hubProxy.On<string>(Settings.HubListenerHandleConversationKilled,
conversationId => OnConversationKilled?.Invoke(conversationId));
}
然後你可以訂閱/退訂從你的活動/片段的那些事件:
protected override void OnPause()
{
base.OnPause();
// Don´t forget to unsubscribe
YourSingleton.Instance.OnAddNewMessage -= OnAddNewMessage;
}
protected override void OnResume()
{
base.OnResume();
YourSingleton.Instance.OnAddNewMessage += OnAddNewMessage;
}
private void OnAddNewMessage(ChatMessage message)
{
// TODO
}
偉大的答案!這實際上是把事情放到了角度。 –
只是一個問題。在這種情況下,我將在哪裏實例化類「YourSignleton」。它會在我將要進行SignalR活動的片段/活動中嗎?在這種情況下,我必須提供一個hubProxy作爲方法「ProxySubscriber」的參數嗎? –
單例是一個衆所周知的模式,只要訪問Singletonclass.Instance,它就會在整個應用程序生命週期中實例化自己,並且只是一次。搜索它,你會發現許多不同的實現。這個想法是在該類中處理信號連接和集線器,因爲您只需要在您的應用中使用單個連接/集線器。 – xleon