2016-06-11 48 views
0

是否可以將集線器連接傳遞給不同的片段和活動,以便我可以在整個應用程序中使用相同的連接? 例如代理連接設置這樣的:Xamarin SignalR - 在不同片段/活動中使用相同的連接代理

var chatHubProxy = hubConnection.CreateHubProxy("ChatHub"); 

我要使用的客戶端方法chatHubProxy.On<string, int, string>("UpdateChatMessage", (message, color, user)在另一片段。與調用服務器方法相同,我可以使用相同的代理在另一個Fragment/Activity中調用它嗎?

回答

1

這很容易,使您的中心靜態。或者甚至更好,在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 
} 
+0

偉大的答案!這實際上是把事情放到了角度。 –

+0

只是一個問題。在這種情況下,我將在哪裏實例化類「YourSignleton」。它會在我將要進行SignalR活動的片段/活動中嗎?在這種情況下,我必須提供一個hubProxy作爲方法「ProxySubscriber」的參數嗎? –

+0

單例是一個衆所周知的模式,只要訪問Singletonclass.Instance,它就會在整個應用程序生命週期中實例化自己,並且只是一次。搜索它,你會發現許多不同的實現。這個想法是在該類中處理信號連接和集線器,因爲您只需要在您的應用中使用單個連接/集線器。 – xleon

相關問題