我正在尝试构建一个实现IHttpControllerActivator
与 StructureMap 的接口,这样我就可以解决控制器的依赖关系,该控制器依赖于HttpRequestMessage
正在 MVC Web API 管道中进行处理。
我的实施Create
如下:
public IHttpController Create(
HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)
{
return (IHttpController)this.Container
.With(request)
.With(controllerDescriptor)
.GetInstance(controllerType);
}
The Container
属性是对 StructureMap 的引用IContainer
实例在构造时传递给激活器。
我对控制器的注册使用反射来获取所有ApiController
实施:
foreach(var controller in this.GetType().Assembly.GetTypes()
.Where(type => typeof(ApiController).IsAssignableFrom(type)))
{
this.For(controller).Use(controller);
}
使用调试器,我检查了控制器实例的初始化并传递了它们的依赖项。然而,当ExecuteAsync
在控制器上调用方法,抛出异常:
无法重用“ApiController”实例。必须根据传入消息构造“ApiController”。检查您的自定义“IHttpControllerActivator”并确保它不会制造相同的实例。
经过一些挖掘和实验后,我发现这是由于在开始时执行的检查所致ExecuteAsync
它检查Request
的财产ApiController
查看它是否已被赋值。如果该属性具有非空值,则表明控制器已用于处理请求并中止操作。
除此之外,我验证了 StructureMap 在编写控制器时尝试使用其 setter 注入行为,并负责Request
具有非空值。
在我的注册表中,我没有配置任何设置器注入,所以我很困惑为什么在这里调用它。关于如何改变所展示的行为,对 StructureMap API 的研究并没有给出任何明显的答案。
我是否错误地调用了 StructureMap?是否有一个配置设置可以用来表示“永远不要分配属性值”?