ServiceStack: container.AutoWire(this) 给出 NullReferenceException

ServiceStack: container.AutoWire(this) gives a NullReferenceException

如果我在我的 AppHostBase 后代(web api 项目)中使用 container.AutoWire(this),它会在 ServiceStack 代码中产生一个 NullReferenceException,如果我使用的是一个 web 项目,因此在 main 方法中使用 CreateHostBuilder(args).Build().Run(); 启动它。

此 Github 项目中重现错误:https://github.com/tedekeroth/ServiceStackAutoWireTest

错误发生在AppHostBase.Netcore.Cs,第158行:

如果我删除 TestAppHost.cs 中的 container.AutoWire(this);,错误消失,但依赖注入不起作用,这意味着 TestAppHost[= 中的 Logger 48=] 未分配:

我不确定为什么会发生这种情况或我能做些什么。我会很感激一些意见,谢谢。

设置
Visual Studio 2019
目标框架:.NET 5.0(控制台应用程序)
项目 SDK:Microsoft.NET.Sdk.Web
ServiceStack 5.11.0

IOC AutoWire API 尝试自动装配对象的所有 public 属性 依赖项,这绝对是您永远不应该尝试使用封装了 AppHost 的对象您的 ServiceStack 应用程序的配置和行为,其中不加区别地覆盖每个 public 属性 将使其处于损坏状态。

不必在 IOC 中注册您的 AppHost,因为它可以通过 HostContext.AppHost 单例在任何地方使用。尝试引用 Host Project 中定义的任何类型也是一个坏主意(AppHost 是典型示例),因为它会在应用程序逻辑依赖项中创建对主机项目的循环引用,这不应该有任何对其宿主项目的引用,你的宿主项目应该引用你所有的项目.dll,配置你的应用程序及其所有依赖项,而不是相反。

如果您需要访问任何插件,建议使用 Service 中的 GetPlugin<T>() API 作为可选插件,或使用 AssertPlugin<T>() 作为必需插件。如果您需要手动解决任何问题,您可以在 Service class 中使用 TryResolve<T>() API。对于您应用程序的任何自定义配置,我建议在自定义 AppConfig class 中注册它们,以便您的服务像任何其他依赖项一样访问。

否则,如果您确实需要访问 AppHost,您可以使用 HostContext.AppHost 单例。如果您绝对需要在 IOC 中拥有 AppHost,只需将其注册为普通单例,即不要尝试自动装配它:

container.Register<IAppHost>(c => this);

然而,如前所述,我强烈反对它,将您的应用程序所需的一切都放在自定义 class(例如 AppConfig)中,像普通依赖项一样访问。