https://stackoverflow.com/questions/31321386/autofac-web-api-get-current-scope

 

Unless you are using OWIN in your API, you should have your Autofac configuration setup in your WebAPI like this, which is the standard way to configure Autofac for WebApi.

Include nuget pacakge Autofac.Integration.WebApi

var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<MyType>(); var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;

Should you need to request the LifetimeScope like in your example, you can then request this from GlobalConfiguration.

var scope = GlobalConfiguration.Configuration.DependencyResolver.GetRequestLifetimeScope();
MyService service = scope.Resolve<MyService>();

Autofac WebApi configuration reference

在和Owin集成的web api中GlobalConfiguration.Configuration是无法使用的。需要使用其他方法

https://www.cnblogs.com/chucklu/p/10420034.html

https://stackoverflow.com/questions/28725753/owin-service-resolution-using-autofac

If you are in a DelegatingHandler or an ApiController you will have a reference to the current HttpRequestMessage. Use message.GetDependencyScope() to get the current request-level dependency scope to resolve services.

public HttpResponseMessage SomeControllerAction()
{
var service = this.Request.GetDependencyScope().GetService(typeof(Service));
}
 protected override async void Initialize(HttpControllerContext controllerContext)
{
string requestBody = await controllerContext.Request.Content.ReadAsStringAsync();
SecurityCheckResult securityCheckResult = requestAnalyzer.SecurityCheck(requestBody);
if (securityCheckResult.Success)
{
var dependencyScope = controllerContext.Request.GetDependencyScope();
var lifetimeScope = dependencyScope.GetRequestLifetimeScope();
var parameter = new NamedParameter("OpCo", securityCheckResult.OpCo);
Program = lifetimeScope.Resolve<IProgramContract>(parameter);
Service = lifetimeScope.Resolve<IDynamicProfileService>(parameter);
} LogUtil.CreateLog(LogLevel.Message, $"BaseApiController.Initialize");
base.Initialize(controllerContext);
}

源码

https://github.com/autofac/Autofac.WebApi/blob/develop/src/Autofac.Integration.WebApi/DependencyResolverExtensions.cs

using System.Web.Http.Dependencies;

namespace Autofac.Integration.WebApi
{
/// <summary>
/// Extension methods to the <see cref="IDependencyResolver"/> interface.
/// </summary>
public static class DependencyResolverExtensions
{
/// <summary>
/// Gets the root lifetime scope from the Autofac dependency resolver.
/// </summary>
/// <param name="dependencyResolver">
/// The dependency resolver from which the root lifetime scope should be retrieved.
/// </param>
public static ILifetimeScope GetRootLifetimeScope(this IDependencyResolver dependencyResolver)
{
var resolver = dependencyResolver as AutofacWebApiDependencyResolver;
return (resolver == null) ? null : resolver.Container;
} /// <summary>
/// Gets the request lifetime scope from the Autofac dependency scope.
/// </summary>
/// <param name="dependencyScope">
/// The dependency scope from which the request lifetime scope should be retrieved.
/// </param>
public static ILifetimeScope GetRequestLifetimeScope(this IDependencyScope dependencyScope)
{
var scope = dependencyScope as AutofacWebApiDependencyScope;
return (scope == null) ? null : scope.LifetimeScope;
}
}
}

而Microsoft.AspNet.WebApi.Core.5.2.7中,有一个扩展HttpRequestMessage的静态类public static class HttpRequestMessageExtensions

public static IDependencyScope GetDependencyScope(this HttpRequestMessage request);

所以我们可以通过request去拿到IDependencyScope 。

然后autofac扩展了IDependencyScope ,增加了1个GetRequestLifetimeScope的方法,拿到这个scope就可以进行resolve了。

autofac 在webapi中拿到当前request的scope的更多相关文章

  1. Autofac - MVC/WebApi中的应用

    Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...

  2. webapi 中使用 protobuf

    相比json来说,好处是速度更快,带宽占用更小.其效果大致等于json+Gzip. 在webapi中使用protobuf的方法为: 引用nuget包 Install-Package protobuf- ...

  3. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

    一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...

  4. 在WebAPI中自动创建Controller

    在MIS系统中,大部分的操作都是基本的CRUD,并且这样的Controller非常多. 为了复用代码,我们常常写一个泛型的基类. public class EntityController<T& ...

  5. webApi中参数传递

    webApi中参数传递 一:无参数的get方法: 前端:    function GetNoParam() { //为了统一:我们都采用$.ajax({}) 方法; $.ajax({ url: '/a ...

  6. 在MVC或WEBAPI中记录每个Action的执行时间和记录下层方法调用时间

    刚才在博客园看了篇文章,http://www.cnblogs.com/cmt/p/csharp_regex_timeout.html  突然联想到以前遇到的问题,w3wp进程吃光CPU都挂起IIS进程 ...

  7. Asp.Net WebAPI 中Cookie 获取操作方式

    1. /// <summary> /// 获取上下文中的cookie /// </summary> /// <returns></returns> [H ...

  8. 关于ASP.NET WebAPI中HTTP模型的相关思考

    对于.NET的分布式应用开发,可以供我们选择的技术和框架比较多,例如webservice,.net remoting,MSMQ,WCF等等技术.对于这些技术很多人都不会陌生,即时没有深入的了解,但是肯 ...

  9. AutoFac+MVC+WebApi源码----我踩过的坑

    发现网上关于AutoFac的Demo源码比较少,综合MVC和WepApi的更少.所以贴出源码 WebApi项目(MVC4不需要引用,历史遗留问题,人懒没删) 建项目 新建类库IAutoFacDal(接 ...

随机推荐

  1. JS-倒计时效果

    团购-限时抢 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  2. LeetCode——Single Number

    Description: Given an array of integers, every element appears twice except for one. Find that singl ...

  3. LeetCode——Contains Duplicate II

    Description: Given an array of integers and an integer k, find out whether there there are two disti ...

  4. ubuntu14.04 LTS Visual Studio Code 编辑器推荐

    除了ubuntu geany (茶壶图标) 这个一直爱好的编辑器,发现一个新的编辑器“Visual Studio Code”,也是很好用,记录下 https://code.visualstudio.c ...

  5. Zabbix漏洞汇总

    一.zabbix: zabbix是监控是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让 ...

  6. c# 执行 CreateHandle() 时无法调用值 Dispose()

    在多线程C#开发中,遇到错误 执行 CreateHandle() 时无法调用值 Dispose().,这个错误是在关闭窗体的时候出来的. 原因是因为窗体还存在CreateHandle()事件,所以还不 ...

  7. python webdriver中对不同下拉框通过文本值的选择

    在自动化中python对下拉框的处理网上相对实例比较少,其它前辈写的教程中对下拉也仅仅是相对与教程来说的,比如下面: m=driver.find_element_by_id("Shippin ...

  8. java定时器学习

    一.这个是利用jdk自带的Thread类的sleep方法实现定时执行任务. package tasker; import java.util.Date; public class tasker01 e ...

  9. 微信小程序 --- 设置app.js/page.js参数的方法

    设置 app.js 文件: //app.js App({ globalData: { is_login:false, userInfo:{} } }) 设置gloabalData的方法: // 定义a ...

  10. 系统事件管理(Events) ---- HTML5+

    模块:events Events模块管理客户端事件,包括系统事件,如扩展API加载完毕.程序前后台切换等. 比如说:网络的链接的和断开这种事件,系统从前台走到后台这种事件: 不包括:点击和滑动页面事件 ...