2012-04-13 145 views
1

我有一個IRoleRepository類型,它接受一個構造函數參數「database」,它接受一種IDbRepository,它本身帶有一個構造函數參數「ConnectionStringName」。我有一個依賴解析器,它有一個GetService方法,雖然下面的代碼工作,但我希望有更好的方法來做到這一點在綁定時間與Ninject 3.0獲取時間。注意我可能有多個IDBRepository實例,每個都有自己的「ConnectionStringName」。Ninject級聯構造函數參數

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

回答

0

OK,我相信我找到了我想要的東西:

通過使用這種在綁定時:

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

這讓我獲取時間:

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

這當然意味着我現在可以根據更多特定的IDbRepository注入庫來改變IDbRepository的構造函數參數。例如:

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

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

您可以用結合使用WithConstructorArgument指定構造函數的參數一起。

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

或使用ToConstructor()

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

但我IDbRepository可能需要數的connectionStringName是,我可以有多個IDbRepository綁定每一個ConfigDB,ContentDB,DiagnosticDb等 – 2012-04-13 13:56:51

相關問題