行为型/观察者模式/EventBusSample/EventBus.cs

(开头部分) 6KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

using System;
using System.Collections.Concurrent;
using System.Reflection;

namespace DesignModeConsole.行为型.观察者模式.EventBusSample;

/// <summary>
/// 事件总线的实现
/// </summary>
public class EventBus : IEventBus
{
    /// <summary>
    /// 存储字典  key:数据类型FullName  value:处理程序类型
    /// </summary>
    private static readonly ConcurrentDictionary<string, List<Type>> _dicEvent = new();

    /// <summary>
    /// 注册以及取消注册的时候需要加锁处理
    /// </summary>
    private static readonly object _obj = new object();

    public EventBus()
    {
        InitRegister();
    }

    /// <summary>
    /// 初始化注册
    /// </summary>
    private void InitRegister()
    {
        lock (_obj)
        {
            if (!_dicEvent.IsEmpty)
            {
                return;
            }
        }

        //自动扫描文件夹下的程序集中指定的类型并且注册
        var baseType = typeof(IEventHandler<>);
        var ignoreNameSpaces = new string[] { "Microsoft.", "System." };
        string[] op = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
        foreach (var file in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll"))
        {
            var ass = Assembly.LoadFrom(file);
            // 查询到实现接口IEventHandler<>的方法 排除系统默认的ignoreNameSpaces开头的程序集
            foreach (var item in ass.GetTypes()
                         .Where(p => !ignoreNameSpaces.Any(t =>
                                         p.FullName != null && p.FullName.StartsWith(t)) &&
                                     IsAssignableToOpenGenericType(p, baseType) &&
                                     !p.IsAbstract &&
                                     p.IsClass))
            {
                //var t1 = item.GetInterfaces();
                foreach (var item1 in item.GetInterfaces())
                {
                    //var t2 = item1.GetGenericArguments();
                    foreach (var item2 in item1.GetGenericArguments())
                    {
后面还有 149 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 算力/个。 规则说明

AI 解读 AI

登录后可用,每次 10 算力,解读结果公开显示在下面。

还没有人解读过这个文件。