Правильно ли использовать указатель на вложенный объект «источника» события? - PullRequest
2 голосов
/ 13 марта 2012

Позвольте мне представить этот вопрос на примере:

У нас есть класс 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 ().Затем запускается событие Notification, и все слушатели могут обработать это уведомление (отобразить его где-нибудь в графическом интерфейсе, показать диалоговое окно и т.И слушатели уведомлений, скорее всего, хотели бы перечислить их всех.Итак, следующее, что приходит на ум, - это NotificationManager.Он имеет коллекцию событий UserNotification и NotificationRaised, которая запускается, когда любое из зарегистрированных уведомлений запускает событие Notification

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(???, ???) 
                  };
    }

И здесь возникает вопрос.Посмотрите на NotificationRaised (???, someEventArgs) .На этом этапе нам нужно передать указатель на исходное уведомление, чтобы слушатель мог работать с этим конкретным уведомлением.В обработчике событий NotificationManager есть поле 'source', которое выглядит именно так, как нам нужно ... Вопрос:

Правильно ли указывать указатель Notification в качестве источника?Или по замыслу и по каким-то веским причинам источник ДОЛЖЕН быть объектом, запускающим событие?

Другими словами, если посмотреть на пример, будет ли это «как и предполагалось»?

Ответы [ 2 ]

1 голос
/ 13 марта 2012

ИМХО нормально заменить отправителя на что-то новое.Самый очевидный пример, где я уже сделал это, был прокси-объект для чего-то еще.Там я подписался на каждое событие реального класса и отправил событие с замененным отправителем (сам прокси).

Но, возможно, это изменение в реализации даст вам достаточно свободы на будущее:

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);
                    }
                };
}
1 голос
/ 13 марта 2012

Если вы пересылаете событие, я не вижу проблем с пересылкой источника из исходного события.

...