行为型/观察者模式/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 算力,解读结果公开显示在下面。
还没有人解读过这个文件。