В чем разница между использованием 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
Источник изображения: https://msdn.microsoft.com/en-us/library/ff921122.aspx
Вот хорошее объяснение EventAggregators.
Event Aggregator - это простой элемент косвенности. В простейшей форме он регистрируется во всех интересующих вас исходных объектах, а все целевые объекты регистрируются в агрегаторе событий. Агрегатор событий реагирует на любое событие из исходного объекта, распространяя это событие на целевые объекты.
Чтобы ответить на вопрос:
Есть ли смысл переходить на использование MessagingCenter? Или какая-нибудь новая лучшая практика?
Если вы не используете что-то вроде EventAggregator, то лучше переключиться на MessagingCenter или создать EventAggregator самостоятельно. Как TheGeneral сделал хороший намек, объяснив, что такое связь. Вы всегда хотите уменьшить сцепление для чистого кода.
Если у вас есть доступ к этим классам (то есть, откуда вы хотите вызывать ваши методы), то разницы на самом деле не так много.
Однако, если у вас нет доступа к этим классам (т. Е. Внутри модели представления или отсоединенного класса), агрегирование событий подписки на сообщения является полезным инструментом.
Центр сообщений уменьшает связь и позволяет моделям представления и другим компонентам связываться друг с другом без необходимости знать что-либо друг о друге, кроме простого контракта на сообщения.
Связь
В программной инженерии связь - это степень взаимозависимости между программными модулями; мера того, насколько тесно связаны две подпрограммы или модули, являются силой отношений между модулями.