Caliburn.Micro框架学习笔记——事件总线机制

Caliburn.Micro 提供了一个称为事件聚合器(Event Aggregator)的事件总线机制,它可以用于实现视图模型之间的解耦和通信。事件聚合器允许不同的视图模型通过发布和订阅事件来进行通信,而不需要彼此直接引用。

何时使用这个功能

事件总线机制适用于以下场景:

  • 解耦视图模型之间的通信

    • 当不同的视图模型需要通信时,但不希望它们直接相互引用时,可以使用事件总线机制来实现解耦。
  • 松散耦合的事件通知

    • 当某个事件的发生需要通知多个订阅者时,可以使用事件总线机制来实现松散耦合的事件通知。
  • 跨越模块的通信

    • 当应用程序具有多个模块或组件,并且需要在它们之间进行通信时,可以使用事件总线机制来实现模块之间的松散耦合。

事件总线机制的对象

  1. 事件聚合器(Event Aggregator)

    • 事件聚合器是 Caliburn.Micro 中的核心组件,用于管理事件的发布和订阅。它允许不同的视图模型之间进行解耦的通信。
  2. 事件(Event)

    • 事件是一个简单的类,通常包含一些数据,用于在视图模型之间传递信息。事件可以是自定义的,根据需要定义不同的事件类型。
  3. 订阅者(Subscriber)

    • 订阅者是订阅特定事件的视图模型或其他对象。一旦订阅了事件,当该事件被发布时,订阅者将收到通知并执行相应的操作。

实现caliburn.micro事件总线机制的步骤 

  1. 创建事件

    • 定义一个事件类,通常包含需要传递的数据。
  2. 发布事件

    • 在一个视图模型中发布(触发)事件,以通知其他订阅者。
  3. 订阅事件

    • 在其他视图模型中订阅感兴趣的事件。一旦订阅了事件,当该事件被发布时,订阅者将收到通知。

具体操作实例

配置事件聚合器

首先,需要在 AppBootstrapper 中注册事件聚合器,以便在应用程序中使用

public class Startup : BootstrapperBase
{
    private SimpleContainer _container;//简单容器

    public Startup()
    {
        this.Initialize();
    }
    protected override async void OnStartup(object sender, StartupEventArgs e)
    {
        await DisplayRootViewForAsync<MainViewModel>();
    }

    protected override void Configure()
    {
        _container = new SimpleContainer();
        this._container.Instance(this._container);

        this._container
            .Singleton<IEventAggregator, EventAggregator>()//容器注入事件聚合器
            .Singleton<IWindowManager, WindowManager>();

        this._container
            .PerRequest<MainViewModel>();
    }

    protected override object GetInstance(Type service, string key)
    {
        return this._container.GetInstance(service, key);
    }
}

定义事件类

定义一个事件类,用于传递需要的信息。

 public class Message
 {
     public Action<int> Callback { get; set; }
 }

发布事件

在需要发布事件的视图模型中,通过 IEventAggregator 发布事件。

 public class MainViewModel : IHandle<Message>, IHandle<string>
 {
     IEventAggregator eventAggregator;
     public MainViewModel(IEventAggregator ea)
     {
         eventAggregator = ea;
     }


     public async void Send()
    {
         //点击按钮的时候执行发布动作
         // 消息内容是根据消息类型进行匹配
         // ** 最终的执行线程并不是由发布决定的,由订阅者决定 **
         Message message = new Message();
         message.Callback = new Action<int>(OnCallback);
         await eventAggregator.PublishOnCurrentThreadAsync(message);//发布此事件
     }
此时回调函数有,用这个目的是为了不想再多建立一个viewmodel了,读者可以自己建一个view和viewmodel,这样就不需要这么写了。但是如果想知道订阅方发送回来的内容,也可以这个写。
private void OnCallback(int value)
{

}
}

 订阅事件

在其他需要接收事件的视图模型中,订阅并处理该事件。这里直接用这个viewModel对应的View来进行订阅。偷个懒。

 public partial class MainView : Window, IHandle<string>, IHandle<Message>
 {
     public MainView()
     {
         InitializeComponent();

         // 这种方式获取注入对象实例,不仅在View中可以使用,VM中也可以使用
         IoC.Get<IEventAggregator>()
             .SubscribeOnUIThread(this);
     }

     public Task HandleAsync(string message, CancellationToken cancellationToken)
     {
         return Task.CompletedTask;
     }

     public Task HandleAsync(Message message, CancellationToken cancellationToken)
     {
         // 有数据返回到发布方
         // 被动触发,触发之后,经过逻辑处理,希望有个数据返回到调用方
         int value = 789;

         message.Callback(value);

         return Task.CompletedTask;
     }
 }

其中订阅过后,此时一旦进入到此订阅方,直接自己执行这两个Task,因为其继承了IHandle,它会根据参数类型去自动匹配,然后因为在发布者当中使用了参数回调,因此可以知道此时从订阅者传回来的处理后的消息。

另外可以从打断点可知,事件的执行线程由订阅者决定。其中包括如下订阅方式——>

// 永远在后台线程执行SubscribeOnBackgroundThread
//eventAggregator.SubscribeOnBackgroundThread(this);
// 在发布者的线程中执行SubscribeOnPublishedThread
//eventAggregator.SubscribeOnPublishedThread(this);
// 永远在UI线程执行SubscribeOnUIThread
//eventAggregator.SubscribeOnUIThread(this);

另外一个需要注意的是

  • 订阅者在不再需要时应调用 eventAggregator.Unsubscribe(this) 取消订阅,以防止内存泄漏。

 总结

以上就是caliburn.micro的事件总线机制,好处会在多个view之间需要传递参数时,通过viewModel层继承IHandle<T>进行事件发布,通过接收方继承IHandle<T>进行事件订阅,可以很好的实现不同模块之间的通信。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matrix Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值