Web API:使用DI创建ApiController

时间:2012-07-12 15:48:12

标签: dependency-injection constructor controller asp.net-web-api

我有一个带参数化构造函数的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

来做到这一点

4 个答案:

答案 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;}
}