2013-09-30 15 views
6

Oprawa jądra Ninject jest taka jak ta, jak wiesz.Ninject zależności powiązanie z xml

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

Chcę uzyskać MyService z xml. WebConfig lub App.Config w ten sposób.

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

Mogę pobrać ten ciąg w kodzie. Ale jak mogę go używać

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

Można Niniject wesprzeć to jako domyślne?

Odpowiedz

6

Można użyć nietypowego przeciążenia To(Type).

typ uzyskać od app.config:

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

Użyj typ:

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

Wszystko powiedziane, proszę zrozumieć, że Ninject zachęca się skonfigurowanie powiązań w kodzie, a nie opierać się na pliki konfiguracyjne.

+1

AssemblyContainingYourType? – barteloma

+0

Zgromadzenie, w którym zaimplementowano 'MyNamespace.MyService'. – YK1

+1

Dlaczego nie jest zalecane? Wygląda lepiej z XML, ponieważ nie trzeba przekompilowywać projektu. – Marc

3

Nie używałam go samodzielnie w żadnym z moich projektów, ale może pomocne może być rozszerzenie Ninml xml.

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> 

Nie wiem jednak, czy można zapisać go w pliku app.config.

+0

Użyłem tego kernel.Load ("configuration.xml"); ale nie działa. – barteloma

+0

Jak wyglądał xml? A jaki był błąd? Co nie działa? – treze

+0

Błąd aktywacji usługi IMyService Brak dostępnych powiązań dopasowania, a typ nie jest samozłączalny. ścieżka Aktywacja: 1) Wniosek o IMyService Sugestie: 1) Sprawdź, czy zostały zdefiniowane wiążąca dla IMyService 2) jeżeli wiązanie zostało zdefiniowane w module, zapewnienia, że ​​moduł został załadowany do jądra . 3) Upewnij się, że przypadkowo nie utworzono więcej niż jednego jądra. 4) Jeśli używasz argumentów konstruktora, upewnij się, że nazwa parametru jest zgodna z nazwą parametru konstruktora. 5) Jeśli korzystasz z automatycznego ładowania modułów, upewnij się, że ścieżka wyszukiwania i filtry są prawidłowe. – barteloma

0

Wreszcie rozwiązanie Nie zapomnij ustawić opcji Kopiuj na wyjście pliku xml Właściwość Katalog tego pliku na Kopiuj, jeśli jest nowsza, aby można go było automatycznie skopiować do katalogu wyjściowego. for more

1

Ninject jądro wiążący jest tak: -

Tworzenie XML jak poniżej: -

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

Następnie 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(); 
       } 
      } 
     } 

Niektóre można napotkać problem z powodu pliku XML ustawienia właściwości, więc trzeba zmienić ustawienia pliku xml. Błąd aktywacji IMyService Brak dostępnych powiązań, a typ nie jest samozłączalny. Rozwiązanie: -Nie zapomnij ustawić Kopiuj do wyjścia własności Informator tego pliku xml do kopiowania czy nowsze, tak że może być skopiowane do katalogu wyjściowego automatycznie

For More: -read https://www.packtpub.com/sites/default/files/9781782166207_Chapter_02.pdf

Powiązane problemy