StructureMap 在 ASP.NET Core .NET5 中看不到类型

StructureMap does not see types in ASP.NET Core .NET5

我正在创建基于 DDD 的示例项目。

  1. 我创建了 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();

            });          

        }
    }
  1. MyLib 项目中,我有 class AppointmentConfirmedEvent 和此事件的处理程序:
    public class EmailConfirmationHandler: IHandle<AppointmentConfirmedEvent>
    {
        public void Handle(AppointmentConfirmedEvent appointmentConfirmedEvent)
        {
            // TBD
        }
    }
  1. 我有临时休息 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 的“闹鬼”版本,公认存在问题。