如何在 C# 中使用泛型设计事件和事件处理程序系统?

问题描述 投票:0回答:1

我想使用泛型在我的 Asp.Net Core 后端创建一个事件系统,以便于创建和注册处理程序。

我在尝试几种解决方案时遇到的主要问题是尝试存储检索和执行事件处理程序时的通用冲突。

我有这样的活动基地:


  internal interface IEvent {

    // Required to get with which tag/key event is stored in an external system
    public static abstract string GetEventName();
  }

  public class TestEvent : IEvent {
    public static string GetEventName() => "test_event";
  }

以及像这样的事件处理程序的基础:

  public interface IEventHandler {
  }

  public interface IEventHandler<TEvent> : IEventHandler where TEvent : IEvent {
    public void HandleEvent(TEvent e);
  }

  public class TestEventHandler : IEventHandler<TestEvent> {
    public void HandleEvent(TestEvent e) {
      // Doing something
    }
  }

我希望能够在服务容器或其他地方轻松注册

event handlers
,这样它们就会自动加载。在某种 EventHandlerFactory 或 EventHandlerRegistrator 中注册它们也很好,但这并不能改变主要问题。

我在运行时从某个来源获取

events
,它们是从 JSON 有效负载反序列化的。

所以我不知道他们的确切类型。

我可以在运行时通过反射确定它们的类型,但这还不够,因为我需要高事件处理吞吐量,并且反射(如果我没记错的话)很慢。

我在存储

event handlers
时也遇到问题,因为它们的泛型类型在运行时丢失,并且在运行时使用特定事件进行转换会产生空引用和其他类型的异常。

asp.net-core generics design-patterns event-handling
1个回答
0
投票

为什么不使用类似 MedaitR 的东西?

© www.soinside.com 2019 - 2024. All rights reserved.