我正在尝试在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;
答案 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