2017-11-19 7 views
0

私は自分のプロジェクトで依存関係注入を実装するためにautofactを使用しています。私は1つのマスターと他のクライアントデータベースがある状況を持っています。ユーザーのログイン時に、データベースから接続文字列を取得し、autofactのContainerBuilderを使用して接続文字列パラメータを解決します。私は正常に定数値でパラメータを登録する次のコードを使用しています。実行時にautofacで接続文字列パラメータを解決するにはどうすればよいですか?

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

参照[この記事](https://cuttingedge.it/blogs/steven/pivot/entry.php?id=99)。あなたの接続文字列は_runtimeの値であり、オブジェクトの構築中には使用しないでください。代わりに、すでに初期化されたオブジェクトグラフのメソッド呼び出しに渡します。 – Steven

答えて

0

WithParameter方法は、ラムダ式のパラメータを持つことができます。

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

第二のラムダは、実行時に実行されます。 ctxはアンビエントなコンテキストですが、ここでも他のものを解決できます。

ユーザー情報にアクセスする場合:

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

私の接続文字列はユーザ​​ベースなので、接続文字列パラメータをコントローラからどのように渡すのですか? – touseefkhan4pk

+0

ユーザを登録してから、 'ctx'パラメータを使って解決してください。詳細については、editとhttps://stackoverflow.com/questions/5203139/register-httpcontext-user-with-autofacを参照してください。 –

関連する問題