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);
}
}

最新文章

  1. js中定义类的方式
  2. Hibernate与Mybatis的概念区别
  3. IPV6
  4. Kylin上chromium不能用flash的解决命令
  5. 【JavaScript】n++ VS ++n
  6. javascript笔记——前端实现分页和查询
  7. Eclipse 常用插件
  8. HTML5-常见的事件- contextmenu 事件
  9. 【转】国外程序员整理的Java资源大全
  10. 第2篇:用as3.0制作一个滚动条组件
  11. React Native入门教程2 -- 基本组件使用及样式
  12. 什么是UDP
  13. 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?
  14. libvirt启动报错Failed to start Virtualization daemon
  15. jenkins pipline 发送邮件
  16. eslint相关工具
  17. 【blog】谷歌浏览器如何设置编码
  18. python的基础1
  19. 【JEECG技术文档】Online唯一校验使用说明
  20. JS 打印图片

热门文章

  1. python的三个函数(eval、exec、complie)和python版RMI
  2. Array数组去重
  3. 【BZOJ3518】点组计数 欧拉函数
  4. android 使用动画 Button移动后不响应点击事件的解决办法
  5. oneThink发生错误,获取当前执行的SQL语句!
  6. 从零打造在线网盘系统之Hibernate配置O/R映射
  7. expdp全库备份rac数据库因错误终止
  8. java反射机制与动态代理
  9. 006-spring cache-缓存实现-01-原生实现
  10. Linux java Tomcat 项目中 new Date 获取时间 8小时 时差