如何在autofac中解析运行时的连接字符串参数?

时间:2017-11-19 13:31:53

标签: asp.net-mvc dependency-injection asp.net-mvc-5 autofac

我在项目中使用autofact来实现依赖注入。我有一个主服务器和其他客户端数据库的情况。当用户登录时,我们从数据库获取连接字符串,并希望使用autofact的ContainerBuilder解析连接字符串参数。我正在使用以下代码成功注册具有常量值的参数。

builder.RegisterType<DbFactory>()
       .As<IDbFactory>()
       .WithParameter("connectionString", "...")
       .InstancePerRequest();

但是,只有在注册时知道该值时,此代码才有效。但我需要一个仅在运行时才知道的值。我在控制器级尝试了类似这样的事情,如下所示,但没有帮助。

 UserViewModel userModel = new UserViewModel();
 userModel.Code = _userContext.User.Code;
 userModel.Username = _userContext.User.Username;
 userModel.Email = _userContext.User.Email;
 userModel.IsLocked = _userContext.User.IsLocked;
 userModel.ConnectionString = _userContext.User.ConnectionString;


 CurrentLoginUser = userModel;

 var builder = new ContainerBuilder();

 builder.RegisterType<DbFactory>()
        .As<IDbFactory>()
        .WithParameter("connectionString", userModel.ConnectionString)
        .InstancePerRequest();

 Autofac.IContainer container = builder.Build();
 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

1 个答案:

答案 0 :(得分:0)

WithParameter方法可以有lambda表达式参数:

builder.RegisterType<DbFactory>().As<IDbFactory>()
       .WithParameter((pi, ctx) => pi.ParameterType == typeof(string) 
                            && pi.Name == "connectionString",
                      (pi, ctx) => "runtime executed"));

第二个lambda将在运行时执行。 ctx是环境背景,你也可以在这里解决其他问题。

如果您想访问用户信息:

builder.RegisterType<DbFactory>().As<IDbFactory>()
       .WithParameter((pi, ctx) => pi.ParameterType == typeof(string) 
                            && pi.Name == "connectionString",
                      (pi, ctx) => ctx.Resolve<UserContext>().User.ConnectionString));