详解c# 事件总线

详解C#事件总线攻略

事件总线是一种让不同对象之间相互通信的方式。它可以让多个对象在程序运行时相互协作,轻松实现松耦合(loose coupling)和高内聚(high cohesion)的编程状态。

事件总线的基础知识

事件总线是一个对象,它处理应用程序中的所有事件,并将它们发送给已经订阅这些事件的对象。这些对象被称为“事件订阅者”。

事件总线的实现方式

  • 委托和事件:在C#中,可以使用委托和事件来实现事件总线。事件总线是一个包含委托和事件的静态类。它负责管理应用程序中所有的事件和事件订阅者。
  • 消息传递机制:另一种实现事件总线的方式是通过消息传递机制,例如使用RabbitMQ或Azure Service Bus等消息队列服务。这种方式可以让事件总线跨越多个系统,实现分布式系统中的事件通信。

基于委托和事件的事件总线实现

委托

在C#中,委托是一种类型,它持有对方法的引用。委托可以被赋值给其他变量,传递给方法,存储在集合中等等。定义委托的方法签名必须和所指向的方法的签名完全一致。

public delegate void MyDelegate(int arg1, int arg2);

事件

事件是委托的一种特殊形式,它允许对象通知其他对象其发生的事情,而不需要知道这些其他对象的类型。事件是由委托和事件处理程序(event handler)组成的。

public event MyDelegate MyEvent;

实现事件总线

下面是一个简单的事件总线示例,包含了事件、委托和事件总线的基本实现。

public static class EventBus
{
    public delegate void EventHandler(object sender, EventArgs args);

    // 事件订阅字典,用于存储事件处理程序列表
    private static readonly Dictionary<Type, IList<EventHandler>> Subscribers = new Dictionary<Type, IList<EventHandler>>();

    // 发布事件
    public static void Publish<T>(object sender, T args)
        where T : EventArgs
    {
        IList<EventHandler> handlers;
        if (Subscribers.TryGetValue(typeof(T), out handlers))
        {
            foreach (var handler in handlers)
            {
                handler(sender, args);
            }
        }
    }

    // 订阅事件
    public static void Subscribe<T>(EventHandler handler)
        where T : EventArgs
    {
        IList<EventHandler> handlers;
        if (!Subscribers.TryGetValue(typeof(T), out handlers))
        {
            handlers = new List<EventHandler>();
            Subscribers.Add(typeof(T), handlers);
        }

        handlers.Add(handler);
    }

    // 取消订阅事件
    public static void Unsubscribe<T>(EventHandler handler)
        where T : EventArgs
    {
        IList<EventHandler> handlers;
        if (Subscribers.TryGetValue(typeof(T), out handlers))
        {
            handlers.Remove(handler);
        }
    }
}

在这个例子中,EventBus是一个静态类,它包含了事件订阅字典Subscribers和三个方法:Publish、Subscribe和Unsubscribe。事件订阅字典用于存储订阅某个类型的事件的所有处理程序。Publish方法用于发布事件,它会根据事件类型查找所有对应的事件处理程序,然后依次调用它们。Subscribe和Unsubscribe方法用于订阅和取消订阅事件。

示例1:事件总线在MVC框架中的应用

假设你正在开发一个MVC框架,并且需要实现控制器(Controller)和视图(View)之间的通信。下面是一个使用事件总线实现这个功能的简单示例。

public class Controller
{
    public Controller()
    {
        EventBus.Subscribe<ViewInitializedEventArgs>(OnViewInitialized);
    }

    private void OnViewInitialized(object sender, EventArgs args)
    {
        // 响应视图初始化事件
        var view = (View)sender;
        view.SetModel(new Model());
    }
}

public class View
{
    public View()
    {
        EventBus.Publish(this, new ViewInitializedEventArgs());
    }

    public void SetModel(Model model)
    {
        // 设置视图的模型
    }
}

public class ViewInitializedEventArgs : EventArgs
{
}

在这个示例中,Controller订阅了ViewInitializedEventArgs事件,并在事件发生时调用OnViewInitialized方法。View在构造函数中发布了ViewInitializedEventArgs事件。当View构造完成后,Controller会收到这个事件,并调用SetModel方法来设置View的模型。

示例2:在控制台应用程序中使用事件总线

下面是一个在控制台应用程序中使用事件总线的简单示例。

public static class Program
{
    public static void Main()
    {
        EventBus.Subscribe<MyEventArgs>(OnMyEvent);

        // 发布事件
        EventBus.Publish(null, new MyEventArgs(1, 2));
    }

    private static void OnMyEvent(object sender, EventArgs args)
    {
        var myArgs = (MyEventArgs)args;
        Console.WriteLine($"MyEvent handled: {myArgs.Arg1}, {myArgs.Arg2}");
    }
}

public class MyEventArgs : EventArgs
{
    public MyEventArgs(int arg1, int arg2)
    {
        Arg1 = arg1;
        Arg2 = arg2;
    }

    public int Arg1 { get; }
    public int Arg2 { get; }
}

在这个示例中,Main方法订阅MyEventArgs事件,并在事件发生时调用OnMyEvent方法。在Main方法中,它发布了一个MyEventArgs事件,并触发OnMyEvent方法。OnMyEvent方法将事件参数Arg1和Arg2输出到控制台。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解c# 事件总线 - Python技术站

(2)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • asp.net利用后台实现直接生成html分页的方法

    当我们开发一个网站时,通常会遇到需要进行数据分页展示的情况,而且用户体验良好的数据分页需要满足快速响应、友好的界面和数据的实时性等需求。为了解决这个问题,我们通常采用后台直接生成 HTML 分页的方式。本文将详细讲解 ASP.NET 中如何通过后台实现直接生成 HTML 分页的方法,包含以下内容: 所需控件和组件的引入 要完成后台直接生成 HTML 分页的功…

    C# 2023年6月3日
    00
  • C# 使用Microsoft Edge WebView2的相关总结

    下面是关于“C#使用MicrosoftEdgeWebView2的相关总结”的完整攻略,包含两个示例。 1. MicrosoftEdgeWebView2简介 MicrosoftEdgeWebView2是一个基于Chromium的Web浏览器控件,可以嵌入到Windows应用程序中。它提供了一组API,用于在应用程序中显示Web内容,并与Web内容进行交互。 2…

    C# 2023年5月15日
    00
  • .net core并发请求发送HttpWebRequest的坑解决

    针对“.net core并发请求发送HttpWebRequest的坑解决”这个问题,我们可以进行以下操作: 问题描述 在使用.NET Core进行并发请求发送HttpWebRequest时,会出现一些并发请求异常和内存泄漏等问题。但是究竟是什么原因导致的呢?以下是一些原因的总结: HttpWebRequest与KeepAlive的冲突。 缺少正确的限制请求并…

    C# 2023年6月3日
    00
  • 使用jQuery Uploader显示文件上传进度

    使用jQuery Uploader显示文件上传进度的完整攻略如下: 准备工作 在使用jQuery文件上传进度条之前,需要确保以下条件已经满足: 你已经安装了jQuery 你已经引入了jQuery Uploader插件 HTML结构 为了展示文件上传进度条,需要为文件上传添加一些HTML元素,如下所示: <input type="file&qu…

    C# 2023年6月1日
    00
  • C#中List和SortedList的简介

    下面我将详细介绍C#中List和SortedList的简介以及它们的区别。 List和SortedList简介 List List是C#中的一个泛型集合类,它可以按照添加的顺序存储任意类型的元素,并且可以动态地扩展大小。List有许多有用的方法,如Add添加新元素、Remove删除元素等。 SortedList SortedList是C#中的一个泛型集合类,…

    C# 2023年6月8日
    00
  • asp.net 判断数组是否存在某个值的方法

    在 Asp.net 中,判断一个数组是否存在某个值的方法有很多种,本文将分享几种常用方法。 方法一:使用 Array.Exists() 方法 Array.Exists() 是 .NET 提供的用于判断数组中是否存在某个元素的方法之一。它定义如下: public static bool Exists<T>(T[] array, Predicate&…

    C# 2023年6月1日
    00
  • ASP.NET 前后台调用方法

    ASP.NET 是一种用于 Web 应用程序开发的框架,可以帮助开发人员构建强大的 Web 应用程序。其中,前后台调用方法是实现 ASP.NET 开发过程中的一个重要技术点,下面我将提供详细的攻略。 首先,我们需要了解 ASP.NET 前后台调用方法的实现原理。在 ASP.NET 中,前后台调用方法主要是通过 Ajax (异步 JavaScript 和 XM…

    C# 2023年6月3日
    00
  • C# Path.GetDirectoryName()方法: 获取指定路径的目录信息

    C#的Path.GetDirectoryName()方法 在C#中,Path.GetDirectoryName()是一个用于获取给定路径的目录信息的方法。 具体来说,Path.GetDirectoryName()返回指定路径中的目录信息,即该路径的目录路径(不包括文件名)。 使用方法 Path.GetDirectoryName()方法接收一个字符串参数,该参…

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部