3

如本文所述,我将 ASP.NET MVC 4 Web API 项目配置为使用 StructureMap 2.6.2.0 ,但尽管显式调用,但访问/api/parts仍返回以下错误:StructuremapMvc.Start();Application_Start()

{
  "ExceptionType": "System.ArgumentException",
  "Message": "Type 'MyProject.Web.Controllers.PartsController' does not have
              a default constructor",
  "StackTrace": "   at System.Linq.Expressions.Expression.New(Type type)\r\n 
                    at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n   
                    at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
}

我实现IDependencyResolverIDependencyScope设置了 Web API 依赖解析器,如下所示~/App_Start/StructureMapMvc.cs

GlobalConfiguration.Configuration.DependencyResolver =
    new StructureMapHttpDependencyResolver(container);

为什么 Web API 仍然在抱怨默认的构造函数?

4

3 回答 3

6

原来错误描述真的很糟糕。正在调用 StructureMap,但由于缺少连接字符串,无法注入依赖的构造函数参数。

这是我修复它的方法IoC.cs

x.For(typeof(IRepository<>)).Use(typeof(MongoRepository<>))
    .CtorDependency<string>("connectionString")
    .Is(yourConnectionString);

我正在这样做(不正确):

x.For<IRepository<SomeEntity>>().Use<MongoRepository<SomeEntity>>();

当 Web API 中发生内部 StructureMap 异常时,确实应该有一种方法来输出它们。

于 2012-08-06T16:25:42.513 回答
0

很明显,没有调用 DI 来提供控制器实例,但我不知道为什么。您是否尝试在帖子提供的结构映射代码(即位于 github 上的代码)中设置调试断点以确保调用它?

于 2012-08-06T13:36:39.997 回答
0

如果您在某些控制器上遇到此错误,但在其他控制器上未遇到此错误,则可能是另一个问题。

要获得更好的异常信息,请在您的 IDependencyScope 实现中的 GetService 方法覆盖中添加 try / catch 并在 catch 块中设置断点。您将能够获得更好的调试信息。

我知道 OP 已经得到了答案,这仅适用于任何偶然发现并发现它有用的人。

于 2015-03-23T15:18:13.530 回答