0

我有一个带参数化构造函数的ApiController。 我读过它可能是框架使用依赖注入来创建控制器。Web API:使用DI创建ApiController

所以我不会这样(像这里解释http://code.google.com/p/autofac/wiki/MvcIntegration):

的Global.asax

builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
//or this 
builder.RegisterType<ObjectsController>().InstancePerHttpRequest(); 

控制器看起来是这样的:

public class ObjectsController : ApiController 
    { 
     IMyObject m_myObject = null; 

     public ObjectsController(IMyObject obj) 
     { 
      m_myObject = obj; 
     } 
} 

的Global.asax 要解决我使用这个依赖项:

builder.Register<IMyObject >((c, p) => 
      { 
       //... create object ... 

       return obj; 
      }).InstancePerHttpRequest(); 

但我得到这个错误:

"ObjectsController' does not have a default constructor.

我想用DI

+2

相关:http://stackoverflow.com/questions/11254292/does-simple-injector-supports-mvc-4-asp-net-web-api。这个问题是关于不同的DI容器,但解决方案是(大约)相同。或者看看[这篇博客文章](http://alexmg.com/post/2012/03/08/Autofac-ASPNET-Web-API-%28Beta%29-Integration.aspx)。 – Steven 2012-07-12 18:14:15

回答

1

最常见的解决方案是使用DI特定的IDependencyResolver实现。

该文章给出了Unity的一个示例,但您应该可以使它与AutoFac相互协作。

1

如果使用的是团结,这是所有你需要在ASP.NET做4的Web API RC(如在8月8日'13):

增加提及“Microsoft.Practices.Unity.dll “[我在版本3.0.0.0,通过NuGet添加] 添加对”Unity.WebApi.dll“的引用[我在版本0.10.0.0,通过NuGet添加] 注册与容器的类型映射 - 类似于通过Unity.WebApi项目添加到项目中的Bootstrapper.cs中的代码。 在从ApiController类继承的控制器中,创建参数化构造函数,它们的参数类型为映射类型 Lo,并且注意,无需另一行代码即可将注入到构造函数中的依赖项!

0

正如其他人所说,使用任何IDependencyResolver实现似乎是一个好主意。

不幸的是,这并没有解决WebAPI需要基于ApiController的类中的无参数构造函数的问题。 =>我只是在我的web api控制器基类中使用属​​性注入而不是构造函数注入,并提供一个空的无参数构造函数。不漂亮,但KISS :-)

public class ApiControllerBaseWithDependency : ApiController 
{ 
    [Microsoft.Practices.Unity.Dependency] 
    protected MyServiceType Service { get; set;} 
}