2012-04-13 4 views
1

私は、コンストラクタ引数 "ConnectionStringName"をとるIDbRepositoryの型を受け入れるコンストラクタ引数 "database"を受け入れるIRoleRepository型を持っています。私はGetServiceメソッドを持っている依存リゾルバを持っていますが、次のコードが動作している間に、Ninject 3.0でBind時間とGet時間にこれを行うより良い方法があることを期待していました。注:私は、それぞれ独自の "ConnectionStringName"を持つ複数のIDBRepositoryインスタンスを持つことがあります。Ninjectカスケーディングコンストラクタ引数

_repository = EngineContext.Current.GetService<IRoleRepository>(
         new ConstructorArgument("database", 
          EngineContext.Current.GetService<IDbRepository>(
           new ConstructorArgument(SystemConstants.ConnectionStringName, SystemConstants.ConfigurationDatabase)))); 

答えて

0

私は私が望んでいたものを見つけ信じます取得時にこれを使用してください:

_repository = EngineContext.Current.GetService<IRoleRepository>(); 

これはIDbRepositoryが注入されているより具体的なリポジトリに基づいてIDbRepositoryのコンストラクタ引数を変更できることを意味します。例えば:

  Bind<IDbRepository>().To<SqlServerRepository>() 
      .WhenInjectedInto<ITimerJobStore>() 
       .WithConstructorArgument(SystemConstants.ConnectionStringName, SystemConstants.ConfigurationDatabase); 

     Bind<ITimerJobStore>().To<TimerJobSqlStore>(); 
2

WithConstructorArgumentを使用すると、コンストラクタ引数をバインディングとともに指定できます。

  Bind<IDbRepository>().To<SqlServerRepository>() 
      .WhenInjectedInto<IRoleRepository>() 
      .WithConstructorArgument(SystemConstants.ConnectionStringName, SystemConstants.ConfigurationDatabase); 

これは私がすることができます:バインド時間でこれを使用することにより

kernel.Bind<IDbRepository>().To<DbRepository>() 
     .WithConstructorArgument(
      SystemConstants.ConnectionStringName, 
      SystemConstants.ConfigurationDatabase); 

または使用ToConstructor()OK

kernel.Bind<IDbRepository>().ToConstructor(
    x => new DbRepository(
      SystemConstants.ConfigurationDatabase, 
      x.Inject<ISomeOtherDependency>()) 
+0

が、私のIDbRepositoryがあるのconnectionStringNameの数をとることができ、私はなどてConfigDBのために複数のIDbRepositoryバインディングそれぞれ、ContentDBの、DiagnosticDbを有していてもよいです –