c# - 使用 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>();
接下来,我认为我需要做两件事;
- 从 .NET Cores DI Container 获取 ICollection 的实例,以便我可以将其传递给 DomainEvents 类。
- 更改 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);
}
}
}
}
}
解决方案
推荐阅读
- python-3.x - 完整的“pdftotext”构建包,用于使用 Python3.7 部署在 AWS-Lambda 上
- c - 查找数组中两个数字的最大可能和
- c++ - 何时通过复制/引用传递?
- sql - 如何使用 CASE 语句获取当前日期?
- vba - 输入产品时如何让表单字段自动填写?
- php - 如何从 html 表单编辑我的 config.php 文件
- azure-devops - 如何从 Azure Devops Powershell YAML 获取输出
- java - 如何将 lambda 从 Java 传递给 Kotlin 方法?
- python - 按唯一组数对 Pandas 列进行排序
- javascript - 使用 jsPDF 创建带有 Unicode 的 PDF