我有一个奇怪的情况,其中StructureMap 2.6.4.1报告的类型显然是未注册的。
在web api控制器中我有
public RedirectToRouteResult GetSlideSet(int id) {
var whatdoIHave = ObjectFactory.WhatDoIHave();
var dbctx = ObjectFactory.GetInstance<MyProject.Models.MyDbContext>();
return RedirectToRoute(WebApiConfig.DefaultRouteName, new {controller="SlideSet", id});
}
WhatDoIHave
报告:
===========================================================================================================
...snip...
MyDbContext(MyProject.Models.MyDbContext)
Scoped as: HttpContext
...snip...
这是WhatDoIHave
中对MyDbContext
的唯一引用
但是在调用GetInstance
时出现错误:
StructureMap.StructureMapException occurred
HResult=-2146232832
Message=StructureMap Exception Code: 202
No Default Instance defined for PluginFamily MyProject.Models.MyDbContext, MyProject, Version=2.4.5.25029, Culture=neutral, PublicKeyToken=null
Source=StructureMap
ErrorCode=202
StackTrace:
at StructureMap.BuildSession.<.ctor>b__0(Type t) in c:\BuildAgent\work\767273992e840853\src\StructureMap\BuildSession.cs:line 33
InnerException:
有谁知道可能出现什么问题或甚至对此进行排查?
编辑:要澄清,MyDbContext
绝对有一个无参数构造函数,但它也有一个非参数构造函数(不是它应该重要)。我甚至在我的测试项目中创建了一个单元测试:
[Fact]
public void get() {
ObjectFactory.Initialize(x => x.Configure(c => c.Configure(r => r.For<MyDbContext>().HttpContextScoped()) ));
ObjectFactory.GetInstance<MyDbContext>().ShouldNotBeNull();
}
哪个通过就好了。奇怪的是,它以同样的方式失败了一段时间但后来开始成功,而我试图缩小问题的范围,我无法重新创建错误。 structuremap是否进行某种系统范围的缓存?
答案 0 :(得分:0)
毕竟问题是MyDbContext有多个构造函数。
MyDbContext() : base() { }
MyDbContext(connectionString) : base(connectionString) { }
删除第二个修复了单元测试中的问题。然而,由于我的单元测试运行器出现问题并且无法运行最新版本的代码,这一点很困惑。我已经解决了这个问题,现在可以用
来解决问题For<MyDbContext>().HttpContextScoped().Use(() => new MyDbContext())