使用Udi Dahan事件示例在ASP.NET Core中注册事件处理程序

时间:2019-05-16 11:03:01

标签: c# 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容器中获取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);
                }
            }
        }
    }
}

0 个答案:

没有答案