C# 基于消息发布订阅模型的示例(下)

 更新时间:2021年03月01日 08:53:22   作者:Hello——寻梦者!  
这篇文章主要介绍了C# 基于消息发布订阅模型的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

一 背景

  在上面的一篇文章中我们介绍了一个完整地基于消息发布和订阅的模型,这篇文章我将介绍一种简单的基于消息的发布和订阅模型,在这个模型中我们将通过构建一个Publisher类来完成对特定的事件和事件订阅进行封装,这个是一个更加轻量级别的方式,使用这个的主要目的是降低类之间彼此的耦合程度,从而方便代码的扩展和访问,最终使代码结构更加合理。

  我们首先来看看具体的Publisher类的构成,后面我们将会对这个类做一个详细的讲解和分析。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Pangea.Common.Utility
{
    /// <summary>
    /// Publisher/Subscriber pattern
    /// This infrastructure works as an instance.
    /// </summary>
    public sealed class Publisher<EventType> where EventType : IComparable
    {
        private static readonly object _locker = new object();
 
        private static readonly Dictionary<EventType, List<Action<object, object, object, object>>> _eventTypeList = new Dictionary<EventType, List<Action<object, object, object, object>>>();
 
        public static void Attach(EventType key, Action<object, object, object, object> act)
        {
            lock (_locker)
            {
                if (!_eventTypeList.ContainsKey(key))
                    _eventTypeList.Add(key, new List<Action<object, object, object, object>>());
                if (!_eventTypeList[key].Contains(act))
                    _eventTypeList[key].Add(act);
            }
        }
 
        public static void Detach(EventType key)
        {
            lock (_locker)
            {
                if (_eventTypeList.ContainsKey(key))
                {
                    _eventTypeList[key].Clear();
                }
            }
        }
 
        public static void Detach(EventType key, Action<object, object, object, object> act)
        {
            lock (_locker)
            {
                if (_eventTypeList.ContainsKey(key) && _eventTypeList[key].Contains(act))
                {
                    _eventTypeList[key].Remove(act);
                }
            }
        }
 
        public static void Notify(EventType key, object p1, object p2, object p3, object p4)
        {
            lock (_locker)
            {
                if (_eventTypeList.ContainsKey(key))
                {
                    foreach (var act in _eventTypeList[key])
                    {
                        act.Invoke(p1, p2, p3, p4);
                    }
                }
            }
        }
 
        public static void Notify(EventType key, object p1, object p2, object p3)
        {
            Notify(key, p1, p2, p3, null);
        }
 
        public static void Notify(EventType key, object p1, object p2)
        {
            Notify(key, p1, p2, null, null);
        }
 
        public static void Notify(EventType key, object p1)
        {
            Notify(key, p1, null, null, null);
        }
 
        public static void Notify(EventType key)
        {
            Notify(key, null, null, null, null);
        }
    }
}

二 完成分析

  在上面的Publisher类中,我们使用了一个EventType类型的泛型参数,这个参数由我们自己来进行定义,一般定义为枚举类型用于标识我们唯一的事件类型,定义好了泛型参数后我们定义了一个_eventTypeList用于定义具体的EventType和对应的处理方法并且将这个放到一个静态的Dictionary中,当然我们在代码中一个事件可以对应多个处理的Action,但是在一般情况下一个事件只有一个对应的处理函数,这里也不排除一个事件对应多个事件的处理函数,另外这里我们默认定义了四个object类型的参数,用于向处理函数进行参数的传递,另外我们的方法都是静态的方法并且在订阅的过程中加了锁从而保证了多线程的环境中保证线程的安全性。

三 使用过程

  在具体的使用过程中主要包括三个重要的步骤:1 定义事件类型。2  消息接收方订阅事件处理(一般在构造函数中调用Attach方法创建时间的唯一订阅)。3  事件发布方发布事件(事件的发送方触发时间并传递参数,调用Notify方式触发事件),完成以上三个步骤就完成了整个基于消息的发布订阅的简单处理,这个Publisher类在处理一般的事件方法中都能够顺利实现,最重要的是事件本身简单易于理解而且能最大程度上降低模块间的耦合,所以在使用的时候还是非常方便的。

以上就是C# 基于消息发布订阅模型的示例(下)的详细内容,更多关于c# 发布订阅模型的资料请关注脚本之家其它相关文章!

相关文章

  • 利用AOP实现SqlSugar自动事务

    利用AOP实现SqlSugar自动事务

    这篇文章主要为大家详细介绍了利用AOP实现SqlSugar自动事务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Unity UGUI的HorizontalLayoutGroup水平布局组件介绍使用

    Unity UGUI的HorizontalLayoutGroup水平布局组件介绍使用

    这篇文章主要为大家介绍了Unity UGUI的HorizontalLayoutGroup水平布局组件介绍使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#利用delegate实现Javascript的each方法

    C#利用delegate实现Javascript的each方法

    这篇文章主要为大家介绍了介绍了C#利用delegate实现Javascript的each方法,感兴趣的朋友可以参考一下
    2016-01-01
  • WPF实现自绘仪表盘Gauge

    WPF实现自绘仪表盘Gauge

    这篇文章主要为大家详细介绍了如何使用WPF实现自绘仪表盘Gauge效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • 自定义WPF分页控件的全过程记录

    自定义WPF分页控件的全过程记录

    接触WPF也有一段时间了,最近遇到了一个自定义分页控件的功能,感觉可以分享下面,所以这篇文章主要介绍了自定义WPF分页控件的相关资料,需要的朋友可以参考下
    2021-05-05
  • c# DevExpress gridcontrol日期行的显示格式设置

    c# DevExpress gridcontrol日期行的显示格式设置

    这篇文章主要介绍了c# DevExpress gridcontrol日期行的显示格式设置,需要的朋友可以参考下
    2017-02-02
  • 基于Unity Line Renderer组件的常用属性说明

    基于Unity Line Renderer组件的常用属性说明

    这篇文章主要介绍了基于Unity Line Renderer组件的常用属性说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C# VB.NET 将Html转为Excel

    C# VB.NET 将Html转为Excel

    本文介绍通过C#和VB.NET代码展示将Html转为Excel文档的方法。文中的示例代码讲解详细,对我们学习C#有一定帮助,感兴趣的小伙伴可以了解一下
    2022-03-03
  • 使用Npoi操作excel的解决办法

    使用Npoi操作excel的解决办法

    本篇文章,小编将为大家介绍,关于使用Npoi操作excel的解决办法,有需要的朋友可以参考一下
    2013-04-04
  • 在Linux上运行C#的方法

    在Linux上运行C#的方法

    这篇文章主要介绍了在Linux上运行C#的方法,实例分析了Linux平台下Mono软件包的应用技巧,以及在此基础之上的C#运行方法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12

最新评论