我已阅读Udi Dahan http://udidahan.com/2009/06/14/domain-events-salvation/所述的引发领域事件。我已经创建了必要的接口和事件,但是我正在努力向DomainEvents类注册我的事件/处理程序。
DomainEvents类使用Register()方法,或者您可以提供IContainer的实例。
我已经使用以下方式在启动文件中的.NET Cores默认DI容器中注册了一个事件:
services.AddScoped<IEventHandler<TicketWasClosedEvent>, TicketWasClosedEventHandler>();
接下来,我想我需要做两件事;
以下是上面链接中要保存的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);
}
}
}
}
}