2012-04-13 11 views
1

Ich habe eine Art IRoleRepository, die ein Konstruktorargument "Datenbank" akzeptiert, die einen Typ von IDbRepository akzeptiert, die selbst ein Konstruktorargument "ConnectionStringName" nimmt. Ich habe einen Abhängigkeits-Resolver, der eine GetService-Methode hat und während der folgende Code funktioniert, hatte ich gehofft, dass es einen besseren Weg geben würde, dies zu tun, um Zeit mit Ninjude 3.0 zu verbinden. Hinweis: Ich habe möglicherweise mehrere IDBRepository-Instanzen mit jeweils einem eigenen "ConnectionStringName".Ninject Cascading Constructor Argumente

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

Antwort

0

OK Ich glaube, ich gefunden, was ich wollte:

Durch die Verwendung dieser beim Binden:

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

Dies ermöglicht es mir zu Verwenden Sie dies bei Get-Zeit:

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

Dies bedeutet natürlich, dass ich nun das Konstruktorargument für IDbRepository basierend auf dem spezifischeren Repository, in das das IDbRepository injiziert wird, variieren kann. zB:

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

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

Sie können verwenden, um die Konstruktorargumente zusammen mit der Bindung anzugeben.

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

oder verwenden ToConstructor()

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

aber meine IDbRepository kann eine Reihe von connection nehmen, das heißt, ich mehrere IDbRepository Bindungen jeweils für eine ConfigDB, contentDB, DiagnosticDb, etc haben –