autofac &web api 切换数据库

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);
        }
    }
复制代码

 

作者:Chuck Lu    GitHub    
posted @   ChuckLu  阅读(769)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2018-02-22 base64对文件进行加密
2017-02-22 通信协议中的转义字符
2017-02-22 ImageCollection
2017-02-22 SharedImageCollection
点击右上角即可分享
微信分享提示