如何使用 Autofac 处理内部构造函数

How to handle internal constructors with Autofac

我正在进行一个项目,将我们的应用程序升级到 .Net 4.8(从 4.5.2)。可以想象,这非常有趣。由于其他领域的一些依赖性变化,我们还需要更新我们正在使用的 Autofac 版本——我们是 4.9.2,我把它提高到 6.1,为什么不呢:)

我已经能够解决管道事件处理方式的变化(设置中间件等),但现在我遇到了注册问题。基本上,在 .Build() 调用期间的某个地方抛出了 NoConstructorsFoundException

总的来说,我理解为什么会这样;有问题的 class 是 public,但唯一的构造函数是 internal。这是在项目外部的程序集中(尽管我确实控制了它)——我查看了“外部”程序集中的注册代码,看看是否有可以更改的内容,但没有看到任何明显的内容。我已经尝试使用 .PublicOnly() 扩展,但我仍然遇到同样的错误。

builder
      .RegisterAssemblyTypes(Assembly.Load("MYASSEMBLY"))
      .PublicOnly()
      .AsImplementedInterfaces()
      .InstancePerDependency();

仅供参考 - 这是从主应用程序调用的:

builder.RegisterModule<MYASSEMBLY.RegistrationModule>();

我还仔细查看了主应用程序中发生的数百个注册,但没有看到任何明显的东西。

最后,我确实尝试将构造函数更改为 public - 这很有效。 class 不再导致此错误 - 但是下一个只有内部构造函数的 class 确实...

我看到这个issue,已经有几年了,看起来很相似,但不仅在这里似乎不适用,它在我们一直使用的版本之前已经修复在一切按预期工作之前。

想法? 作为辅助 - 有没有一种方法可以轻松查看 4.9.2 和 6.1 之间可能影响此变化的内容?

我希望您添加自己的 IConstructorFinder,其中包括列表中的 'internal' 个构造函数。

有关如何操作的说明,请参阅

至于行为的变化,在 v6 中,我们对其进行了更改,因此构造函数位于容器构建时,而不是第一次解析组件时。