我有一个带参数化构造函数的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”没有默认构造函数。
我以为我可以用DI
来做到这一点答案 0 :(得分:2)
如果您想在ASP.NET Web API中使用DI,这个答案可以为您提供更好的解决方案: https://stackoverflow.com/a/10592456/538387
答案 1 :(得分:1)
最常见的解决方案是使用DI特定的IDependencyResolver实现。
那篇文章给出了Unity的一个例子,但是你应该可以很容易地使用AutoFac。
答案 2 :(得分:1)
如果您使用的是Unity,那么您需要在ASP.NET 4 Web API RC中执行此操作(截至2013年8月8日):
添加对“Microsoft.Practices.Unity.dll”的引用[我在3.0.0.0版本上,通过NuGet添加] 添加对“Unity.WebApi.dll”的引用[我的版本为0.10.0.0,通过NuGet添加] 使用容器注册类型映射 - 类似于Unity.WebApi项目中添加到项目中的Bootstrapper.cs中的代码。 在从ApiController类继承的控制器中,创建参数类型作为映射类型的参数化构造函数 瞧,您可以在没有其他代码行的情况下将依赖项注入构造函数中!
答案 3 :(得分:0)
正如其他人所说,使用任何IDependencyResolver实现似乎是个好主意。
不幸的是,对于我来说,这并没有解决WebAPI在其基于ApiController的类中需要无参数构造函数的问题。 =&GT;我只是在我的web api控制器基类中使用属性注入而不是构造函数注入,并提供一个空的无参数构造函数。不漂亮,但亲吻: - )
public class ApiControllerBaseWithDependency : ApiController
{
[Microsoft.Practices.Unity.Dependency]
protected MyServiceType Service { get; set;}
}