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. shell爬虫简易脚本(线程数可控)

    1.介绍 以机电之家网站为例 经过初步分析,机电之家的数据量较大,并且数据组织规则较为统一,适合以代码方式进行全量爬取. 企业列表URL统一为http://www.jdzj.com/yp_vlist_ ...

  2. Windows系统下做定时任务为Oracle数据库每天自动备份

    1.创建备份目录d:\backup, 创建批处理命令Bak.bat,编写备份脚本 ? 1 2 exp user/passwd@orcl DIRECT=Y BUFFER=100000 FILE=D:\b ...

  3. 170504、MongoDB和MySQL对比(译)

    一.概要 几十年来,关系型数据库已经成为企业应用程序的基础,自从MySQL在1995年发布以来,它已经成为一种受欢迎并且廉价的选择.然而随着近年来数据量和数据的不断激增,非关系数据库技术如MongoD ...

  4. Jenkins之pipeline流水线配置

    使用gitlab监听事件一旦git push自动部署 使用构建后操作 配置完用户构建前一步会自动构建下一个项目 pipeline插件 新建视图 点击run运行

  5. has to be escaped using backslash to be included in string value\n

    [root@d myssh]# cat ESdel_bulk_file1544528090.log{"error":{"root_cause":[{" ...

  6. JIRA licence crack and etc

    https://my.oschina.net/u/199525/blog/313788 http://blog.csdn.net/joinandjoin/article/details/9052785 ...

  7. 前端程序员:月薪 5K 到 5 万

    入行行头:5 大硬件 请准备好以下东西 一颗人类的大脑:智商在平均水平线以上即可 一份强烈的渴望:我的代码要可以运行在任何一个有浏览器的设备上. 一台笔记本电脑:不需要花费很多钱得那种,只要它可以运行 ...

  8. python3.7.2 ssl版本过低导致pip无法使用的问题

    环境:系统是centos6.6,python:python3.7.2 问题:安装好python3.pip后,在通过pip install xx 安装模块时,发现无法安装的问题,提示版本太低,系统默认的 ...

  9. stark - 增、删、改

    一.效果图 二.增.删.改 知识点: 1.解决代码重用 {% include 'form.html' %} 2.自定制配置modelform 每张表,就可自定义配置 labels , widges.. ...

  10. 从LayoutInflater分析XML布局解析成View的树形结构的过程

    上一篇博客分析了XML布局怎么载入到Activity上.不了解的能够參考 从setContentView方法分析Android载入布局流程 上一篇博客仅仅是分析了怎么讲XML布局加入到 Activit ...