我在项目中使用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));
答案 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));