2016-12-13 2 views
0

Ich habe eine Web-App mit zwei verschiedenen Controllern und ich verwende Konfigurationsdateien als Eingabe für die Controller. Früher habe ich nur eine einzige Konfigurationsdatei verwendet und konnte diese an den Kernel binden, und alles würde gut funktionieren. Jetzt werde ich jedoch zwei separate Konfigurationsdateien verwenden und Ninject benötigen, um zu verstehen, welches zu verwenden ist. Hier ist ein Beispiel, wie ich dachte, ich würde tun. Kommentierte weg ist auch, was ich getan habe, um die Konfiguration vorher zu binden, als ich nur einen hatte.Ninject binden zwei verschiedene Parameter des gleichen Typs in Global.asax

 var kernel = NinjectWebApi.Kernel; 
     //get base dependency instances from the container 
     var configurationClient = kernel.Get<IConfigurationClient>(); 

     //initialise local dependencies 
     var config1 = configurationClient.Get(new GetConfigurationByKeyRequest("Config1")); 
     var config2 = configurationClient.Get(new GetConfigurationByKeyRequest("Config2")); 

     //bind local dependencies 

//This is what I did when I had just one config 
     //kernel.Bind<IConfiguration>().ToMethod(c => config1.Configuration); 

     kernel.Bind<IMy1Controller>().To<My1Controller>() 
      .WithConstructorArgument("config1", config1.Configuration) 
      .WithConstructorArgument("config2", config2.Configuration); 

      kernel.Bind<IMy2Controller>().To<My2Controller>() 
       .WithConstructorArgument("config2", config2.Configuration); 

     //Set the dependency resolver to use ninject 
     GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 

Was ist der Zweck des „WithConstructorArgument“ wenn ich es nicht eine Eingabe angeben können zu?

Antwort

1

OK, also habe ich eine Lösung gefunden. Aber ich bin mir nicht sicher, ob das der richtige Weg ist.

var kernel = NinjectWebApi.Kernel; 
    //get base dependency instances from the container 
    var configurationClient = kernel.Get<IConfigurationClient>(); 

    //initialise local dependencies 
    var config1 = configurationClient.Get(new GetConfigurationByKeyRequest("Config1")); 
    var config2 = configurationClient.Get(new GetConfigurationByKeyRequest("Config2")); 

    //bind local dependencies 
    kernel.Bind<IConfiguration>().ToMethod(c => config1.Configuration).Named("config1"); 

    kernel.Bind<IConfiguration>().ToMethod(c => config1.Configuration).Named("config1"); 

    kernel.Bind<IMy1Controller>().To<My1Controller>() 

     kernel.Bind<IMy2Controller>().To<My2Controller>() 

    //Set the dependency resolver to use ninject 
    GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 

Und damit ninject wissen, welches ich die Unterschrift leicht im Konstruktor verwenden müssen ändern:

public My1Controller([Named("Config1")] IConfiguration config1) 
Verwandte Themen