我正在创建基于 DDD 的示例项目。
- 我创建了 SharedKernel 项目,其中有我的 DomainEvents 类
public static class DomainEvents
{
public static IContainer Container { get; set; }
static DomainEvents()
{
Container = StructureMap.Container.For<GenericTypesScanning>();
}
public static void Raise<T>(T args) where T : IDomainEvent
{
foreach (var handler in Container.GetallInstances<IHandle<T>>())
{
handler.Handle(args);
}
}
}
这是类 GenericTypesScanning
public class GenericTypesScanning : Registry
{
public GenericTypesScanning()
{
Scan(scan =>
{
// 1. Declare which assemblies to scan
scan.Assembly("MyLib");
// 2. Built in registration conventions
scan.AddAllTypesOf(typeof(IHandle<>));
scan.WithDefaultConventions();
});
}
}
- 在
MyLib
项目中,我有此事件的类AppointmentConfirmedEvent
和处理程序:
public class EmailConfirmationHandler: IHandle<AppointmentConfirmedEvent>
{
public void Handle(AppointmentConfirmedEvent appointmentConfirmedEvent)
{
// TBD
}
}
- 我有一个临时的 rest api 控制器,我想在那里检查一切是否都正确注册,我正在这样做:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET: api/<ValuesController>
[HttpGet]
public IEnumerable<string> Get()
{
var appointmentConfirmedEvent = new AppointmentConfirmedEvent();
DomainEvents.Raise(appointmentConfirmedEvent);
return new string[] { "value1","value2" };
}
}
但是当调用 DomainEvents.Raise
时,不会处理事件,因为内部调用 Container.GetallInstances<IHandle<T>>()
返回空数组。
我用控制台应用程序做了类似的例子,一切正常。知道为什么它在 ASP.NET Core .NET 5 项目中不起作用吗?
-杰克