Windows Phone Silverlight アプリ用の単純なメッセージング システムを作成しています。
アイデアは、さまざまな xaml ページと他のオブジェクトがメッセージング オブジェクトにサブスクライブし、受信/処理するメッセージの種類と Action<> デリゲートをハンドラーとして渡すことです。
アクションが発生すると、メッセージ (ペイロード付き) が正しいサブスクライバーに送信されます。
これは、メッセージ クラスとして必要なものの簡単なドラフトです。
public class MessageBus
{
private List<Subscriber> subscribers;
public MessageBus()
{
subscribers = new List<Subscriber>();
}
public void Subscribe(string messageType, Action<object>subscriber){
subscribers.Add(new Subscriber(messageType, subscriber));
}
public void SendMessage(object message, string messageType)
{
foreach (Subscriber subscriber in subscribers)
{
if (subscriber.MessageType == messageType && subscriber.Reciever != null)
{
subscriber.Reciever(message);
}
}
}
}
public class Subscriber
{
public string MessageType { get; set; }
public Action<object> Reciever { get; set; }
public Subscriber(string messageType, Action<Object> reciever)
{
MessageType = messageType;
Reciever = reciever;
}
}
したがって、さまざまなサブスクライバーは、タイプ Action で自分自身を追加します。私が理解しているように、元のページ/オブジェクトへの参照が常に存在するため、元のページ/オブジェクトがガベージ コレクションされるのを防ぐことができます (そうでないと思いますか?)。
私は実際にサブスクライブを解除することはできません。また、常にそうであるとは限りません。メッセージング キューは、アプリケーションの存続期間中そのままです。
WeakReferences を実装する必要がありますか?
WeakReferences はオーバーヘッドを追加しますか?
使用中のメモリが小さいため、これを考慮することさえ狂っていますか?