StructureMap 在 ASP.NET Core .NET5 中看不到类型
StructureMap does not see types in ASP.NET Core .NET5
我正在创建基于 DDD 的示例项目。
- 我创建了 SharedKernel 项目,我的 class 用于 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);
}
}
}
这是 class 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
项目中,我有 class AppointmentConfirmedEvent
和此事件的处理程序:
public class EmailConfirmationHandler: IHandle<AppointmentConfirmedEvent>
{
public void Handle(AppointmentConfirmedEvent appointmentConfirmedEvent)
{
// TBD
}
}
- 我有临时休息 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>>()
returns 空数组。
我用控制台应用做了类似的例子,一切正常。知道为什么它在 ASP.NET Core .NET 5 项目中不起作用吗?
-亚采克
首先要做的是检查类型扫描诊断:
http://structuremap.github.io/diagnostics/type-scanning/.
如果缺少程序集,类型扫描可能会有点脆弱。诊断可能会指出哪里出错了。另外,也试试你的 WhatDoIHave()
诊断。
此外,请确保您知道不再支持 StructureMap 并已被 Lamar 取代:
AddAllTypesOf()
方法不适用于开放泛型。请参阅 StructureMap 文档中的 ConnectImplementationsToTypesClosing()
方法:http://structuremap.github.io/generics/
提醒一下,不再支持 StructureMap。此外,2.6.4.1 是 StructureMap 的“闹鬼”版本,公认存在问题。
我正在创建基于 DDD 的示例项目。
- 我创建了 SharedKernel 项目,我的 class 用于 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);
}
}
}
这是 class 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
项目中,我有 classAppointmentConfirmedEvent
和此事件的处理程序:
public class EmailConfirmationHandler: IHandle<AppointmentConfirmedEvent>
{
public void Handle(AppointmentConfirmedEvent appointmentConfirmedEvent)
{
// TBD
}
}
- 我有临时休息 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>>()
returns 空数组。
我用控制台应用做了类似的例子,一切正常。知道为什么它在 ASP.NET Core .NET 5 项目中不起作用吗?
-亚采克
首先要做的是检查类型扫描诊断:
http://structuremap.github.io/diagnostics/type-scanning/.
如果缺少程序集,类型扫描可能会有点脆弱。诊断可能会指出哪里出错了。另外,也试试你的 WhatDoIHave()
诊断。
此外,请确保您知道不再支持 StructureMap 并已被 Lamar 取代:
AddAllTypesOf()
方法不适用于开放泛型。请参阅 StructureMap 文档中的 ConnectImplementationsToTypesClosing()
方法:http://structuremap.github.io/generics/
提醒一下,不再支持 StructureMap。此外,2.6.4.1 是 StructureMap 的“闹鬼”版本,公认存在问题。