ASP .Net 4 Web Api RC + Autofac手动解析

时间:2012-06-20 16:13:52

标签: asp.net-web-api autofac asp.net-mvc

我正在尝试在Web Api方法中使用依赖性解析器。这很好用,并且与经典的ASP.NET MVC和DepedencyResolver.GetService()

一起工作正常

但我无法在WepApi方法中使用它。

我的注册将所有实例注册为InstancePerApiRequest,并且如果我在我的WebAPiConroller的构造函数中添加我在引导程序中注册的所有类型中的任何类型,那么在内部调用它们时会注入正常但不再存在。

在我说的Get Method

中就像这样
var userRepository = (IUserRepositoryu)GlobalConfiguration
       .Configuration.DependencyResolver.GetService(typeof(IUserRepository));

我得到了无范围的WebRequest错误。奇怪的是,在将它们全部更改为GlobalConfiguration之前,它在Beta中运行良好。

所以我的问题是,如何在我的webAPi的生命周期范围内激活我的Autofac注册程序集

我的错误:

“从请求实例的作用域中看不到具有匹配'AutofacWebRequest'的标记的作用域。这通常表示注册为每HTTP请求的组件正被SingleInstance()组件(或类似组件)重新请求场景。)在Web集成下,总是从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖,永远不要从容器本身请求。“

 var resolver = new AutofacWebApiDependencyResolver(container);
 configuration.DependencyResolver = resolver;

3 个答案:

答案 0 :(得分:5)

在Web API中,全局依赖项解析程序用于访问全局实例。每个请求服务来自Web API为处理请求而创建的依赖范围。我不确定Web API中是否有任何方法可以访问当前的依赖范围 - 知道它会很有趣。

这里最好的选择就是使用依赖注入而不是像这样直接调用解析器。代码的哪一部分需要进行此调用?

答案 1 :(得分:0)

AutoFac与ASP.NET WebAPI的集成考虑使用它。

WebAPi的依赖解析器与ASP.NET MVC略有不同,所以请确保您已经实现了适用于WebAPI的解析器并将其添加到WebAPI配置中。

http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver

答案 2 :(得分:0)

如错误所示,您必须始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项。正确的方法是从当前的web api请求中获取依赖关系:

// Get the request lifetime scope so you can resolve services.
var requestScope = Request.GetDependencyScope();
// Resolve the service you want to use.
var userRepository = requestScope.GetService(typeof(IUserRepository)) as IUserRepository;

从Autofac官方文档中了解更多信息: http://docs.autofac.org/en/latest/integration/webapi.html#standard-web-api-filter-attributes-are-singletons