实现在C#的消息/订阅机制(Implementing a message/subscription

2019-08-07 07:04发布

我与原型MVVM模式一个WPF应用程序。 下面回答这个问题,我已经建立了一个ModelProviderService暴露模型作为属性。 该服务的消费者是的ViewModels,即他们拉他们的模型,从服务,而不是他们实例化的亲自过问。

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

现在,这里是将发生什么:

  • 一个ViewModel改变EG的属性LoginModel属性。
  • 的视图模型通过设置其属性推模型属性回服务: modelService.LoginModel.MyProperty = localLoginModel.MyProperty;
  • 该服务将发布一条消息:“嘿,我喜欢的类型的模型LoginModel只是改变了。”
  • 已经订阅了此消息的任何其他视图模型将拉动从服务这个变化的模型。

我怎么能实现:

  1. 在“广播消息”?
  2. 订阅的消息?

Answer 1:

你可以使用一个MessageBusEventAggregator使用弱引用发布消息给用户。 看看我的实现 (或在的NuGet packgage )。

它也可以当元帅的消息处理为您的UI线程(如果你需要更新UI组件)通过应用HandleOnUIThreadAttribute上的Handle方法。

你的情况用法是这样的:

// 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<LoginModelChanged>
{
    public SomeViewModel(IMessageBus messageBus)
    {
        messageBus.Subscribe(this);
    }

    public void Handle(LoginModelChanged message)
    {
        // Do something with message.Model
    }
}

如果您想了解更多关于内部运作以及如何实现这一点; 检查出的源代码GitHub的库 。 随意,只要你喜欢使用代码:)



Answer 2:

如果你想一个WPF应用程序中发布的消息,你可能会去EventAggregator的棱镜框架。

EventAggregator允许的ViewModels到弱subsribe事件,无需对发送者的知识。 这使您可以轻松地翻过组件或模块分发消息。



文章来源: Implementing a message/subscription mechanism in C#