2012-09-05 40 views
17

工作,我用从autofac MVC的整合是这样的:MVC的Web API不Autofac集成

... 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

但现在我要重新与新的网络API RTM的解决方案。 我想使用新的AutofacWebApiDependencyResolver类。

但如果我这样做与AutofacWebApiDependencyResolver我得到这个错误:

The type Autofac.Integration.WebApi.AutofacWebApiDependencyResolver does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator.

我读,我必须现在设置解析器做到这一点:

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

但是,如果我把它'=',它没有设置。它仍然是DefaultResolver ...

如果我再次使用MVC AutofacDependencyResolver类,它将起作用。

autofac和web api rtm仍然存在问题吗? (目前的集成是RC版)

回答

44

ASP.Net Wep.API和ASP.NET MVC使用两个不同的IDependencyResolver(因为他们设计的Wep.API不依赖于ASP.NET MVC),所以你需要设置两个:

var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
GlobalConfiguration.Configuration.DependencyResolver = 
    new AutofacWebApiDependencyResolver(container); 

所以AutofacDependencyResolver需要注入decencies定期MVC Controller衍生控制器。

并且需要AutofacWebApiDependencyResolver将依赖关系注入到Web.API ApiController派生的控制器。

而且不要忘记在呼叫您的集装箱制造商来注册你的API控制器(它通常builder.RegisterControllers方法不同):

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
+0

我再次使用AutofacDependencyResolver对我的工作。感谢您的信息。有一些参考链接吗?微软/ autofac解释了这一点吗?是使用ApiControler的,但是如果我想将DependecyResolver强制转换为AutofacWebApiDependencyResolver,它会失败。 – user437899

+0

这似乎是,如果我通过DependencyResolver.Curren访问解析器,我得到MVC解析器。 WebApiResolver semms负责将参数注入ApiControllers。如果我想解决控制器方法中的任何类型,我必须使用MVC Resovler – user437899

+0

@Max抱歉,我两次都迟到了,其他社区成员拒绝了您的编辑,因为它虽然增加了一个优点,但您应该留下评论相反(我知道你没有足够的声誉,但它并不遥远),因为处理回复编辑的政策非常严格,审稿人认为你想改变我的答案太多。无论如何感谢您在我的建议中编辑的帮助。 – nemesv