2012-03-13 1 views
2

例でこの質問を紹介しましょう:イベントの 'source'のネストされたオブジェクトポインタを使用するのは正しいですか?

私たちはUserNotificationクラスを持っています。通知に関する情報、ユーザーオプションの可能性があります。

public class UserNotification 
{ 
    // Event fired on notification broadcast 
    public event EventHandler<NotifyEventArgs> Notification; 

    public string Title { get; set; } 
    public string Description { get; set; } 
    public List<NotificationResults> Options { get; set; } 
    // ... 

    // This function is called to raise notification 
    public void Notify() 
    { 
     if (Notification != null) Notification(null, new NotifyEventArgs()); 
    } 
} 

私たちにはたくさんの通知があります。プログラムのいくつかの部分が(ユーザーのために)通知を発生させる必要があるたびに、通知オブジェクトを取り、Notify()メソッドを呼び出します。通知イベントが発生し、すべてのリスナーがこの通知を処理します(gui、showダイアログボックスなどのどこかに表示してください)。そして通知リスナーは、おそらく、それらをすべてリストすることが大好きです。したがって、次に注目すべきことは、NotificationManagerです。これは、登録された通知のいずれかがその通知イベントが発生したときに

public class NotificationManager 
{ 
    public event EventHandler NotificationRaised; 

    private List<UserNotification> _notifications; 

    public void AddNotification(UserNotification notification) 
    { 
     _notifications.Add(notification); 
     notification.Notification +=() => 
        { 
         if (NotificationRaised != null) NotificationRaised(???, ???) 
        }; 
    } 

そして、ここで質問が来て解雇されUserNotificationとNotificationRaisedイベントのコレクションを持っています。 NotificationRaised(???、someEventArgs)を見てください。この時点で、ソース通知へのポインタを渡す必要があります。これにより、リスナーはこの特定の通知を処理できます。 NotificationManagerのイベントハンドラには、必要なものと正確に見える 'source'フィールドがあります。質問は次のとおりです。

通知ポインタをソースとして指定しても問題ありませんか?または設計といくつかの良い理由によって、ソースは、がイベントを発生させているオブジェクトである必要がありますか?

つまり、この例を見ると、「意図した動作として」ですか?

答えて

1

イベントを転送している場合は、元のイベントからソースを転送することに問題はありません。

+0

私は、あまりにも!しかし、私はそれが悪いいくつかのケースがあるかもしれないと思った。または制限。この場合に再生できる.Net標準ライブラリのいくつかの「隠された機能」。または、これを行うことは、「意図したとおりには動作しない」という結果になるかもしれないと言います。 – MajesticRa

+0

@MajesticRa:助けがあれば、何も問題なく前にこれをやったことがあります。 –

+0

ありがとうございます!誰もその主題の悪い面を証明しているわけではないので、経験豊富な開発者の意見を聞くことは本当に良いことです。 – MajesticRa

1

IMHO送信者を新しいものに置き換えても問題ありません。私がすでにこれをした最も明白な例は、何かの代理オブジェクトでした。そこでは、実際のクラスのすべてのイベントを購読し、置き換えられた送信者(プロキシ自体)でイベントを転送しました。

しかし、おそらく実装にこの変更は、将来のためにあなたに十分な自由を与える:

public void AddNotification(UserNotification notification) 
{ 
    AddNotification(notification, false); 
} 

public void AddNotification(UserNotification notification, bool useOriginalSender) 
{ 
    _notifications.Add(notification); 
    notification.Notification += (originalSender, e) => 
       { 
        var temp = NotificationRaised; 

        if (temp != null) 
        { 
         var sender = useOriginalSender ? originalSender : this; 
         temp(sender, NotifyEventArgs.Empty); 
        } 
       }; 
} 
+0

ありがとうございました。プロキシを考える...私は、そのような転送は本当にプロキシケースの "意図されたもの"だと信じています。それは、こうしたすべてのケースがそのような「送信者」の主張がまったく存在する理由であると私はさらに説得します。 – MajesticRa

関連する問題