如何在混合使用Web API和MVC应用程序中使用Autofac解决Web API控制器?

31

嗨,我有一个MVC应用程序,在其中定义了一些依赖项到我的Web API。

public class AutofacWebApiDependenceResolver : IDependencyResolver
{
    private readonly IComponentContext container;
    public AutofacWebApiDependenceResolver(IContainer container)
    {

     if (container == null)
     {
         throw new ArgumentNullException("container");
     }
     this.container = container;
    }

    public object GetService(Type serviceType)
    {
        if (serviceType == null)
        {
            throw new ArgumentNullException("serviceType");
        }
        var ret = this.container.ResolveOptional(serviceType) ;
        return ret;
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {            
        if (serviceType == null)
        {
            throw new ArgumentNullException("serviceType");
        }            
        Type enumerableType = typeof(IEnumerable<>).MakeGenericType(serviceType);
        var ret = (IEnumerable<object>)this.container.ResolveOptional(enumerableType);
        return ret;
    }
}

然后在我的引导类中,我将其作为以下形式在Application_Start中调用:

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependenceResolver((IContainer)container);

当我调试代码时,我可以看到所有服务都已经在我的DependencyResolver中注册,但我仍然收到以下错误:

发生了错误。类型“WebApp.Controllers.AuthenticateController”没有默认构造函数。

这是我的控制器代码:

public class AuthenticateController : ApiController
{
    private readonly IFormsAuthenticationService formsAuthenticationService;
    private readonly IMemberShipProvider memberShip;
    private readonly IDataService dataService;

    public AuthenticateController(
        IMemberShipProvider memberShip,
        IFormsAuthenticationService formsAuthenticationService, IDataService dataService)
    {
        this.memberShip = memberShip;
        this.formsAuthenticationService = formsAuthenticationService;
        this.dataService= dataService;
     }

}

如何将参数传递给API控制器。简单控制器工作良好。


请看这个链接:https://dev59.com/rWDVa4cB1Zd3GeqPhd-W - freshbm
@freshbm 是的,我看到了,但是没有得到解决方案 :-S - progrAmmar
方法builder.RegisterApiControllers随WebApi集成包https://code.google.com/p/autofac/wiki/WebApiIntegration一起提供。 - nemesv
3
在调用 builder.Build() 之前,您需要调用 builder.RegisterApiControllers... - nemesv
你是在使用Web API还是MVC?问题被标记为MVC,标题也说是MVC,但问题的内容围绕着Web API。 - Travis Illig
显示剩余7条评论
2个回答

70

我建议您按照以下步骤在您的应用程序中同时使用MVC和WebApi:

首先,您的项目需要引用以下内容:

  • Autofac
  • Autofac.WebApi
  • Autofac.Mvc5(将数字更改为与您的ASP.NET MVC版本相匹配)

然后在您的Autofac注册中,您需要包含以下内容,这将注册MVC和WebApi控制器以及您所需的任何其他注册。然后将容器附加到MVC DI和WebApi DI。

var builder= new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register MVC Controllers
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers
//Register any other components required by your code....

var container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //Set the WebApi DependencyResolver

我希望这可以帮到你。


6
在我的情况下,GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); 这一行代码至关重要。 - droidbot
3
谢谢,这个解决了我的问题!我也意识到我安装了错误的nuget软件包,因为我正在使用WebApi2。所以一旦我删除了Autofac.WebApi并安装了Autofac.WebApi2,它就像魔术般地工作了。感谢@jonhoare。 - zanther
我真的非常需要那个! - Ayo Adesina
3
新手指南:@jonhoare答案中的代码应放在App_Start/WebApiConfig.cs文件的Register方法中。 - 1_bug
1
@Jennet。谢谢!这是我的最后一个问题,没有安装Autofac.WebAPI2。一旦安装了它,一切都顺利了。谢谢! - Kakoritz
以上代码应该放在哪里?@1_bug,我们如何将其放入WebApiConfig.cs中?那里没有对container的引用。谢谢。 - Alex

8

nemesv的指导起了作用。

builder.RegisterApiControllers(Assembly.GetExecutingAssembly())

在调用builder.Build()之前,先调用builder.RegisterApiControllers


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接