在C#中实现消息/订阅机制

我正在使用MVVM模式对WPF应用程序进行原型设计。 在回答这个问题后,我设置了一个ModelProviderService ,它将模型公开为属性。 服务的消费者是视图模型,即他们从服务中提取模型而不是自己实例化。

 class ModelProviderService { private LoginModel loginModel; public LoginModel LoginModel { get { return loginModel; } set { loginModel = value; } } private ProjectsModel projectsModel; public ProjectsModel ProjectsModel { get { return projectsModel; } set { projectsModel = value; } } public ModelProviderService() { loginModel = new LoginModel(); projectsModel = new ProjectsModel(); } } 

现在,这是将要发生的事情:

  • 视图模型更改例如LoginModel属性的属性。
  • viewmodel通过设置其属性将model属性推送回服务: modelService.LoginModel.MyProperty = localLoginModel.MyProperty;
  • 该服务应发布一条消息:“嘿,我的模型LoginModel刚改变了。”
  • 订阅此消息的任何其他视图模型都将从服务中提取此更改的模型。

我该如何实现:

  1. “广播信息”?
  2. 订阅邮件?

您可以使用MessageBusEventAggregator通过使用弱引用向订阅者发布消息。 看看我的实现 (或NuGet包 )。

它还可以通过在Handle方法上应用HandleOnUIThreadAttribute来为您编组消息处理到UI线程(如果需要更新UI组件)。

在您的情况下使用将是这样的:

 // The message public class LoginModelChanged { public LoginModelChanged(LoginModel model) { Model = model; } public LoginModel Model { get; private set; } } // Service that publishes messages public class ModelProviderService { private IMessageBus _messageBus; private LoginModel _loginModel; public ModelProviderService(IMessageBus messageBus) { _messageBus = messageBus; } public LoginModel LoginModel { get { return _loginModel; } set { _loginModel = value; _messageBus.Publish(new LoginModelChanged(value)); } } } // Subscribing ViewModel public class SomeViewModel : IHandle { public SomeViewModel(IMessageBus messageBus) { messageBus.Subscribe(this); } public void Handle(LoginModelChanged message) { // Do something with message.Model } } 

如果您想了解更多有关内部工作方式以及如何实现这一点的信息; 查看GitHub存储库中的源代码。 随意使用您喜欢的代码:)

如果要在WPF应用程序中分发消息 ,可以使用prism框架的EventAggregator 。

EventAggregator允许视图模型弱到事件,不需要有关发送者的知识。 这使您可以轻松地分发组件或模块中的消息。