首页 > 解决方案 > 使用 Udi Dahan 事件示例在 ASP.NET Core 中注册事件处理程序

问题描述

我已经阅读了 Udi Dahan http://udidahan.com/2009/06/14/domain-events-salvation/描述的提升域事件。我已经创建了必要的接口和事件,但我正在努力使用 DomainEvents 类注册我的事件/处理程序。

DomainEvents 类使用 Register() 方法,或者您可以提供 IContainer 的实例。

我已经在我的启动文件中的 .NET Cores 默认 DI 容器中注册了一个事件;

services.AddScoped<IEventHandler<TicketWasClosedEvent>, TicketWasClosedEventHandler>();

接下来,我认为我需要做两件事;

  1. 从 .NET Cores DI Container 获取 ICollection 的实例,以便我可以将其传递给 DomainEvents 类。
  2. 更改 Udi Dahans 示例中的 Raise() 方法,因为它在 IContainer 上使用 ResolveAll() 方法,而在 .NET Core 中该方法似乎不可用。

这是 DomainEvents 类的副本,请按照上面的链接保存;

public class DomainEvents
{
    [ThreadStatic] //so that each thread has its own callbacks
    private static List<Delegate> Actions;

    public static IContainer Container { get; set; }

    public static void Register<T>(Action<T> callback) where T : IDomainEvent
    {
        if (Actions == null)
        {
            Actions = new List<Delegate>();
        }

        Actions.Add(callback);
    }

    public static void ClearCallbacks()
    {
        Actions = null;
    }

    public static void Raise<T>(T args) where T : IDomainEvent
    {
        if (Actions != null)
        {
            if (Container != null)
            {
                foreach (var handler in Container.ResolveAll<EventHandler<T>>) // ResolveAll doesn't exist on IContainer
                {
                    handler.Handle(args);
                }
            }

            foreach (var action in Actions)
            {
                if (action is Action<T>)
                {
                    ((Action<T>) action)(args);
                }
            }
        }
    }
}

标签: c#asp.net-coredomain-driven-design

解决方案


推荐阅读