2012-11-16 101 views
1

這裏是Register方法的singature:爲什麼我們需要爲IMessenger.Subscribe()明確設置收件人?

IMessanger.Register<TMsg>(object recipient, Action<TMsg> action); 

爲什麼我們需要收件人如果動作保持在其目標屬性的參考? 當給定動作不使用定義類的實例成員時,則Target爲空。
但這種情況很少發生。我的意思是,這不是我們使用事件處理程序的常見方式。

我想了解爲什麼沒有附加的Register方法簽名沒有收件人蔘數?我錯過重要的東西嗎?

IMessanger.Register<TMsg>(Action<TMsg> action); 

回答

2

實際上,您可以從應用程序中的任何位置註冊收件人,而不僅僅是收件人的類。例如,請考慮以下情形:

public class ClassA : ViewModelBase 
{ 
    public ClassA() 
    { 
     Messenger.Default.Register<SomeMessage>(this, SomeAction); 
     Messenger.Default.Register<SomeMessage>(ViewModelLocator.ClassB, SomeAction); 
    } 

    private void SomeAction(SomeMessage msg) 
    { 
     // do something 
    } 
} 

public class ClassB : ViewModelBase 
{ 
    public ClassB() 
    { 

    } 
} 

在第二Registor方法調用的情況下,工作的對象屬性將不會是相同的收件人蔘數。因此,爲了保持一致,始終需要收件人蔘數是最安全的。

當然,您認爲這種情況可能不如您僅僅通過this作爲收件人的情形。因此,在這種情況下,如果輸入this變得繁冗的你,那麼你總是可以定義它只是沿着實際Register方法傳遞目標屬性自己Register擴展方法:

public static class MessengerHelper 
{ 
    public static void Register<TMessage>(this IMessenger messenger, Action<TMessage> action) 
    { 
     messenger.Register<TMessage>(action.Target, action); 
    } 
} 

然後,您可以註冊類似的消息這個:

public class ClassA : ViewModelBase 
{ 
    public ClassA() 
    { 
     Messenger.Default.Register<SomeMessage>(SomeAction); 
    } 

    private void SomeAction(SomeMessage msg) 
    { 
     // do something 
    } 
} 
+0

但是如何使用收件人價值?是不是隻有行動足以對綁定的消息作出反應?或者TDaver已經說過,這是一個通過單一呼叫註銷所有處理程序的工具。 –

+1

如何使用收件人值?各種消息類具有對應於特定收件人的「目標」屬性。因此,如果您在發送消息之前設置了「目標」屬性,那麼只有該對象纔會收到消息。因此,消息系統需要您在調用「註冊」方法時指定收件人,以便將正確的消息發送給正確的收件人。如果您在註冊郵政服務時未給您的名字,您是否希望收到您的郵件? – bugged87

+0

答案TDaver提供的解釋只是解釋了Messenger類提供的便利,因爲您的消息已經註冊到收件人。但是,它並沒有解釋收件人的目的。該目的僅用於在設置消息的目標屬性時查找正確的對象。 – bugged87

0

這樣做,你可以說Messenger.UnregisterRecepient(recepient);然後取消訂閱註冊到這個接收器的每個動作。

+1

我認爲OP意味着什麼的影響「爲什麼註冊'方法假設收件人基於Action參數的Target屬性?」 – bugged87