2013-09-30 7 views
6

Ninject Kernel-Bindung ist wie Sie wissen.Ninject-Abhängigkeit Bindung von xml

kernel.Bind<IMyService>().To<MyService>(); 

Ich möchte MyService von XML erhalten. WebConfig oder App.Config so.

<add key="service" value="MyNamespace.MyService"> 

Ich kann diese Zeichenfolge in Code abrufen. Aber wie kann ich es

kernel.Bind<IMyService>().To<???>();

Oder kann Niniject dies als Standard unterstützen?

Antwort

6

Sie können die nicht generische To(Type) Überladung verwenden.

Get Art von Ihrem app.config:

string service = ConfigurationManager.AppSettings["service"]; 
Type serviceType = AssemblyContainingYourType.GetType(service); 

den Typ Verwendung:

kernel.Bind<IMyService>().To(serviceType); 

Alle gesagt, haben Sie bitte Verständnis, dass Ninject ermutigt, dass Sie Bindungen in Code konfigurieren und verlassen Sie sich nicht auf Konfigurationsdateien.

+1

AssemblyBeinhaltenIhrTyp? – barteloma

+0

Assembly, in dem 'MyNamespace.MyService' implementiert ist. – YK1

+1

Warum wird es nicht empfohlen? Es sieht besser mit XML aus, weil Sie Ihr Projekt nicht neu kompilieren müssen – Marc

3

Ich habe es nicht selbst in irgendeinem meiner Projekte verwendet, aber vielleicht könnte die Ninject XML-Erweiterung hilfreich sein.

https://github.com/ninject/ninject.extensions.xml/wiki

<module name="myXmlConfigurationModule"> 
    <bind service="MyNamespace.IMyService, MyAssembly" 
      to="MyNamespace.MyServiceImplementation, MyAssembly" /> 
    <bind service="MyNamespace.IMyOtherService, MyAssembly" 
      to="MyNamespace.MyOtherServiceImplementation, MyAssembly" /> 
</module> 

Nicht obwohl sicher, wenn Sie es in einer Datei App.config speichern kann.

+0

Ich habe diesen Kernel verwendet.Load ("configuration.xml"); aber nicht funktioniert. – barteloma

+0

Wie sah die XML aus? Und was war der Fehler? Was hat nicht funktioniert? – treze

+0

Fehler beim Aktivieren von IMyService Keine passenden Bindungen sind verfügbar und der Typ ist nicht selbstbindbar. Aktivierungspfad: 1) Antrag auf IMyService Vorschläge: 1) Stellen Sie sicher, dass Sie eine Bindung für IMyService 2) Wenn die Bindung definiert wurde in einem Modul definiert haben, stellen Sie sicher, dass das Modul in den Kernel geladen wurde . 3) Stellen Sie sicher, dass Sie nicht versehentlich mehr als einen Kernel erstellt haben. 4) Wenn Sie Konstruktorargumente verwenden, stellen Sie sicher, dass der Parametername dem Parameternamen des Konstruktors entspricht. 5) Wenn Sie das automatische Laden von Modulen verwenden, stellen Sie sicher, dass der Suchpfad und die Filter korrekt sind. – barteloma

0

Schließlich die Lösung Vergessen Sie nicht, die Copy to Output Ihrer XML-Datei Verzeichnis-Eigenschaft dieser Datei zu kopieren, wenn neuere, so dass es automatisch in das Ausgabeverzeichnis kopiert werden kann. for more

1

Ninject Kernel Bindung ist wie folgt: -

XML erstellen, wie unten: -

<module name="myXmlConfigurationModule"> 
    <bind service="MyNamespace.IMyService, MyAssembly" 
      to="MyNamespace.MyServiceImplementation, MyAssembly" /> 
    <bind service="MyNamespace.IMyOtherService, MyAssembly" 
      to="MyNamespace.MyOtherServiceImplementation, MyAssembly" /> 
</module> 

Dann Code: -

using Ninject; 

    enter code here 

    class ABC 
     { 
      public void CallingMethodUsingNinject() 
      { 
       private IKernel kernel= new StandardKernel(); 
       kernel.Load("yourXmlFileName.xml"); 
       bool ismodule = kernel.HasModule("myXmlConfigurationModule");//To Check The module 
       if(ismodule) 
       {   
       IMyService MyServiceImplementation = kernel.Get<IMyService>(); 
       MyServiceImplementation.YourMethod(); 
       } 
      } 
     } 

Einige Sie Problem konfrontiert können aufgrund XML-Datei Eigenschaftseinstellungen müssen also Ihre XML-Dateieinstellungen ändern. Fehler beim Aktivieren von IMyService Es sind keine übereinstimmenden Bindungen verfügbar, und der Typ ist nicht selbstbindbar. Lösung: -Nicht vergessen, die kopieren Ausgabe Directory-Eigenschaft dieser XML-Datei zu setzen, wenn neuere zu kopieren, so dass es automatisch

Für mehr zum Ausgabeverzeichnis kopiert werden: -Lesen https://www.packtpub.com/sites/default/files/9781782166207_Chapter_02.pdf