Error: No default instance is registered for ... when I can use GetInstance() directly to retrieve the object

Error: No default instance is registered for ... when I can use GetInstance() directly to retrieve the object

我有一个 WebAPI 项目,我在其中创建了一个 ControllerActivator,它使用自定义依赖范围,本质上调用 StructureMap container.GetNestedContainer() 以便为每个请求创建一个嵌套容器。

然后我有一个自定义控制器激活器,它使用这个嵌套容器(通过自定义依赖范围)来激活我的控制器。所有的依赖都被StructureMap注入到controller中,依赖的所有依赖被注入,等等。

我有一个验证器(动作过滤器),它在控制器激活器之前运行,并使用 IContainer.Inject() 方法为每个单独的请求将身份注入嵌套容器。如果我在控制器激活器中设置一个断点,我向容器询问我要激活的特定控制器,我可以这样做:

_container.GetInstance(typeof(IMyIdentity))

以及依赖范围的容器(这将是嵌套容器)returns 我是我期望的实例。但是,当我按 F10 让它尝试解析控制器时,出现错误:

No default Instance is registered and cannot be automatically determined for type 'IMyIdentity'

它附带了一个列表,其中包含大约 6 个链式依赖项,它试图创建这些依赖项以满足它试图创建的控制器的要求。对于我的生活,我无法弄清楚为什么我可以直接向容器询问实例并且它会把它给我,但是当间接询问它时却找不到它。 _container.WhatDoIHave() 还显示 MyIdentity class 正在注册到 IMyIdentity 接口,名称为“(默认)”,生命周期为 "Object"(虽然我我不确定 "Object" 生命周期是什么意思)。

事实证明,其中一个依赖项被错误地注册到 Singleton(),因此 StructureMap 试图在根容器中构建该实例,然后引入在嵌套容器,这显然是做不到的。

由于 Singleton() 注册是错误的,简单的解决方案是删除它,问题就消失了。如果我们真的需要它成为一个单例,我绝对可以看到这可能是一个更大的问题。