https://stackoverflow.com/questions/24188025/is-there-another-way-of-changing-database-instance-in-autofac

WebAPI: Retrieve GET parameter from Controller Constructor

The constructor is invoked too early, you can't access the parameters from there. However, you can override the Initialize method and retrieve the GET parameters from the context:

protected override void Initialize(HttpControllerContext controllerContext)
{
foreach (var parameter in controllerContext.Request.GetQueryNameValuePairs())
{
Debug.WriteLine(string.Format("{0} = {1}", parameter.Key, parameter.Value));
} base.Initialize(controllerContext);
}

可以通过下面的代码拿到post方法的RequestBody。   post的参数通过ActionFilter来处理会更好

 string requestBody = await controllerContext.Request.Content.ReadAsStringAsync();

可以把c也作为参数传递过去,然后c可以对service进行resolve

 builder.Register((c,p) => GetProgramContract(c,p.Named<MessageHeader>("Header"))).As<IProgramContract>().InstancePerLifetimeScope();
builder.Register((c,p) => new DynamicProfileService(GetProgramContract(c,p.Named<MessageHeader>("Header")))).As<IDynamicProfileService>().InstancePerLifetimeScope(); private static ProgramContract GetProgramContract(IComponentContext c, MessageHeader header)
{
var reportContract = c.Resolve<IReportContract>();
var adminWebContract = c.Resolve<IAdminWebContract>();
var serviceFactory = c.Resolve<IContractFactory>(); var connectionString = adminWebContract.AdminWebGetRepositoryConnectionString();
RepositoryComponent repositoryComponent = new RepositoryComponent(reportContract);
var program = repositoryComponent.GetProgramIdAndCultureCodeByCountryCode(connectionString,header.OpCo); var programContract =
new ProgramContract(serviceFactory, program.Id, program.CultureCode, program.CountryCode);
return programContract;
}

最新的方法2019-02-26

发现通过ActionFilter来处理,是最好的办法。通过actionContext可以得到controller,并且也可以得到已经解析好的actionContext.ActionArguments["request"]。通过dynamic直接调用后台已知的必定会存在的property。

将参数传递给autofac,autofac那边根据传递过来的参数不同,实例化不同的 数据库连接

public class ServiceInitializeAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
dynamic obj = actionContext.ActionArguments["request"];
var controllerContext = actionContext.ControllerContext;
var controller = controllerContext.Controller as BaseApiController;
var dependencyScope = controllerContext.Request.GetDependencyScope();
var lifetimeScope = dependencyScope.GetRequestLifetimeScope();
if (controller == null)
{
throw new NotSupportedException($"Type {controllerContext.Controller.GetType()} is not supported.");
}
var parameter = new NamedParameter("Header", obj.Header);
controller.Program = lifetimeScope.Resolve<IProgramContract>(parameter);
controller.Service = lifetimeScope.Resolve<IDynamicProfileService>(parameter);
}
}

autofac &web api 切换数据库的更多相关文章

  1. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  2. OWIN support for the Web API 2 and MVC 5 integrations in Autofac

    Currently, in the both the Web API and MVC frameworks, dependency injection support does not come in ...

  3. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...

  4. integration asp.net web api with autofac and owin

    There is an example project showing Web API in conjunction with OWIN self hosting https://github.com ...

  5. .net core web api + Autofac + EFCore 个人实践

    1.背景 去年时候,写过一篇<Vue2.0 + Element-UI + WebAPI实践:简易个人记账系统>,采用Asp.net Web API + Element-UI.当时主要是为了 ...

  6. 在asp.net web api 2 (ioc autofac) 使用 Serilog 记录日志

    Serilog是.net里面非常不错的记录日志的库,另外一个我认为比较好的Log库是NLog. 在我个人的asp.net web api 2 基础框架(Github地址)里,我原来使用的是NLog,但 ...

  7. 使用ASP.NET WEB API构建基于REST风格的服务实战系列教程(一)——使用EF6构建数据库及模型

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 使用Entity Framework Code First模式构建数据库对象 已经决定使用EF C ...

  8. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在数据访问层应用Repository模式来隔离对领域对象的细节操作是很有意义的.它位于映射层 ...

  9. 使用Autofac在ASP.NET Web API上实现依赖注入

    在ASP.NET Web API里使用Autofac 1.通过NuGet安装Autofac.WebApi(当时安装的是Autofac 3.1.0) PM > Install-Package Au ...

随机推荐

  1. 使用synchronized(非this对象)同步代码块解决脏读问题

    首先通过示例来学习验证多个线程调用同一个方法时随机的. package syn_out_asyn; import java.util.ArrayList; import java.util.List; ...

  2. Request.getRequestURL

    getRequestURI()就相当于你在写一个JSP页面的时候会有这样的东西"action='/WebRoot/xxx'"这个方法就是获得'/WebRoot/xxx',也就是说它 ...

  3. Java可视化JVM监控软件

    jdk自带.jdk安装目录下 1.JConsole 选择 不安全 可用不多 2.VisualVM

  4. 树链剖分-点的分治(点数为k且距离最长的点对)

    hdu4871 Shortest-path tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 130712/130712 K ( ...

  5. postgresql----数据库表约束----UNIQUE

    四.UNIQUE ---- 唯一约束 唯一键可以是单个字段,也可以是多个字段的组合,设置唯一约束后,INSERT或UPDATE时如果表中唯一键字段中已存在该数据,则拒绝该行数据的INSERT或UPDA ...

  6. Jenkins持续集成【简介】

    1.1 目前主流网站部署的流程    目前主流网站部署方法,通过Hudson/Jenkins工具平台实现全自动部署+测试,是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台 ...

  7. 170606、防止sql注入(三)

    SpringMVC利用拦截器防止 SQL注入案例一个简单的PHP登录验证SQL注入 比如一个公司有一个用来管理客户的客户管理系统,在进入后台进行管理的时候需要输入用户名和密码.假设在客户端传给服务器的 ...

  8. Python爬虫框架Scrapy实例(一)

    目标任务:爬取腾讯社招信息,需要爬取的内容为:职位名称,职位的详情链接,职位类别,招聘人数,工作地点,发布时间. 一.创建Scrapy项目 scrapy startproject Tencent 命令 ...

  9. RSA与AES的区别

    RSA 非对称加密,公钥加密,私钥解密,反之亦然.由于需要大数的乘幂求模等算法,运行速度慢,不易于硬件实现. 通常私钥长度有512bit,1024bit,2048bit,4096bit,长度越长,越安 ...

  10. java-mybaits-00103-入门程序原生的【查、增、删、改】

    一.需求 实现以下功能: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户 更新用户 删除用户 二.具体步骤 1.增加pom引用 2.增加log4j.properties # ...