3

我正在尝试在 Web Api 方法中使用依赖解析器。这可以正常工作,并且可以与带有 DepedencyResolver.GetService() 的经典 ASP.NET MVC 一起正常工作

但我不能让它在 WepApi 方法中工作。

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

就像我说的获取方法中的这样

var userRepository = (IUserRepositoryu)GlobalConfiguration
       .Configuration.DependencyResolver.GetService(typeof(IUserRepository));

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

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

我的错误:

“从请求实例的范围中看不到带有与‘AutofacWebRequest’匹配的标记的范围。这通常表明注册为每个 HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。)在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身请求依赖项。”

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

3 回答 3

5

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

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

于 2012-06-22T06:29:19.560 回答
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

于 2012-06-20T18:07:17.097 回答
0

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

// 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

于 2017-03-05T11:02:21.563 回答