0

我有一个带有参数化构造函数的 ApiController。我读到框架可能使用依赖注入创建控制器。

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

全球.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

4 回答 4

2

如果您想在 ASP.NET Web API 中使用 DI,这个答案可以为您提供更好的解决方案: https ://stackoverflow.com/a/10592456/538387

于 2012-10-22T18:53:38.197 回答
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] 使用容器注册您的类型映射 - 类似于 Bootstrapper.cs 中的代码,该代码由 Unity.WebApi 项目添加到您的项目中。在从 ApiController 类继承的控制器中,创建参数化构造函数,它们的参数类型为映射类型 Lo,你瞧,你将依赖项注入到你的构造函数中,而无需另一行代码!

于 2013-08-08T10:51:06.373 回答
1

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

那篇文章给出了一个使用 Unity 的示例,但您应该能够相当轻松地使其与 AutoFac 一起使用。

于 2012-10-22T19:00:47.373 回答
0

正如其他人所建议的那样,使用任何 IDependencyResolver 实现似乎是一个好主意。

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

 public class ApiControllerBaseWithDependency : ApiController
{
    [Microsoft.Practices.Unity.Dependency]
    protected MyServiceType Service { get; set;}
}
于 2015-05-03T09:18:58.403 回答