当WhatDoIHave()报告时,Structuremap无法找到项目?

时间:2013-12-13 20:08:17

标签: structuremap

我有一个奇怪的情况,其中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是否进行某种系统范围的缓存?

1 个答案:

答案 0 :(得分:0)

毕竟问题是MyDbContext有多个构造函数。

MyDbContext() : base() { }
MyDbContext(connectionString) : base(connectionString) { }

删除第二个修复了单元测试中的问题。然而,由于我的单元测试运行器出现问题并且无法运行最新版本的代码,这一点很困惑。我已经解决了这个问题,现在可以用

来解决问题
For<MyDbContext>().HttpContextScoped().Use(() => new MyDbContext())