В чем разница между использованием MessagingCenter и стандартных обработчиков событий.NET для информирования заинтересованных сторон об изменениях?

В чем разница между использованием MessagingCenter и стандартных обработчиков событий.NET для информирования заинтересованных сторон об изменениях?

Ниже приведены две (непроверенные) реализации одной и той же вещи:

public class FooClass {
  public event EventHandler SomeEvent;

  public void DoSomeWork() {
     // ... stuff
    if(SomeEvent != null)
      SomeEvent(this, EventArgs.Empty);
  }
}

public class BarClass {
  FooClass _foo;

  public BarClass() {
    _foo = new FooClass();
    _foo.SomeEvent += delegate {
      // ... did something
   };
  }
}

Стихи:

public class FooClass {
  public const string SomeEventName = "SomeEvent";
  public void DoSomeWork() {
    // ... stuff
    MessagingCenter.Send<FooClass>(this, SomeEventName);
  }
}

public class BarClass : IDisposable {
  public BarClass() {
    MessagingCenter.Subscribe<FooClass>(this, FooClass.SomeEventName, delegate {
      // .. did something
   });
  }

  public void Dispose() {
    MessagingCenter.Unsubscribe<FooClass>(this, FooClass.SomeEventName);
  }
}

Из того, что я могу сказать, похоже, нет никакой разницы, но если кто-то может предложить какие-либо плюсы или минусы для того или другого, это помогло бы мне понять. В настоящее время я использую обработчики событий.

Есть ли смысл переходить на использование MessagingCenter? Или какая-нибудь новая лучшая практика?

3 ответа

Решение
  • MessagingCenter в основном используется в шаблоне Model-View-ViewModel.
  • Это отличный способ общаться и передавать данные или уведомлять об обновлениях среди ViewModels не зная, кто отправил это кому через простой договор сообщения.
  • Ex. На одном экране, если вы делаете какой-либо сервисный вызов для получения новых данных и хотите уведомить другие экраны об обновлении их интерфейса через широковещательное сообщение с вашего текущего экрана, тогда MessagingCenterэто лучший подход.
  • Это разъединяет их, не делая никакой зависимости среди ViewModels, в то время как EventHandlers создает зависимость и может запрещать что-либо освобождать. Вы явно должны отделить обработчики событий от событий, чтобы лучше высвободить ресурсы.
  • MessagingCenter следует применять, когда получателю все равно, кто отправил сообщение, а отправителю не важно, кто его получит. События должны использоваться, когда получатель должен знать, кто отправил сообщение, но отправителю все равно, кто его обрабатывает.
  • Это хорошо использовать MessagingCenter над Events но, если вы слишком много используете слишком много сообщений, используя MessagingCenterбыло бы трудно определить, кто его отправил, и когда он был отправлен, трудно было бы установить связь между сообщениями, что затрудняет процесс отладки приложения.

MessagingCenter от Xamarin используется для уменьшения связи между ViewModels, так как отправителю и получателю не нужно знать друг друга.

Вы все еще можете создать подобную структуру, создав нечто вроде "EventHub"/"EventAggregator", который знает отправителя и получателя и использует события.NET.

Сам MessagingCenter является своего рода EventAggregator

Изображение EventAggregator

Источник изображения: https://msdn.microsoft.com/en-us/library/ff921122.aspx

Вот хорошее объяснение EventAggregators.

Event Aggregator - это простой элемент косвенности. В простейшей форме он регистрируется во всех интересующих вас исходных объектах, а все целевые объекты регистрируются в агрегаторе событий. Агрегатор событий реагирует на любое событие из исходного объекта, распространяя это событие на целевые объекты.

Чтобы ответить на вопрос:

Есть ли смысл переходить на использование MessagingCenter? Или какая-нибудь новая лучшая практика?

Если вы не используете что-то вроде EventAggregator, то лучше переключиться на MessagingCenter или создать EventAggregator самостоятельно. Как TheGeneral сделал хороший намек, объяснив, что такое связь. Вы всегда хотите уменьшить сцепление для чистого кода.

Если у вас есть доступ к этим классам (то есть, откуда вы хотите вызывать ваши методы), то разницы на самом деле не так много.

Однако, если у вас нет доступа к этим классам (т. Е. Внутри модели представления или отсоединенного класса), агрегирование событий подписки на сообщения является полезным инструментом.

Центр сообщений уменьшает связь и позволяет моделям представления и другим компонентам связываться друг с другом без необходимости знать что-либо друг о друге, кроме простого контракта на сообщения.

Связь

В программной инженерии связь - это степень взаимозависимости между программными модулями; мера того, насколько тесно связаны две подпрограммы или модули, являются силой отношений между модулями.

Другие вопросы по тегам