2016-05-26 13 views
0

Ich verwende Ninject, um Abhängigkeiten aufzulösen, und es funktioniert bis jetzt flüssig. In diesem Beispiel benötige ich eine Liste von Objekten, die basierend auf Daten in meiner App.config initialisiert wurden.Konfigurieren von Ninject zum Zurückgeben einer Ergebnisliste

Ninject gibt jedoch eine leere Liste zurück. Der folgende Ausschnitt ist ein Beispiel dafür, was ich versucht habe. Ich habe die Konstruktoren für die Klassenhierarchie für einen bestimmten Kontext eingefügt.

public ServiceSchedulerBuilder(IList<ITextExportService> textExportServices) 
{ 
    _textExportService = textExportServices;  
} 

public TextExportService(IHotFolderManager hotFolder) 
{ 
    _hotFolder = hotFolder; 
} 

public HotFolderManager(string baseFolderPath, string defaultFileSearchPattern) 
{ 
    //Some IO 
} 

//In a Ninject AppModule... 
Kernel.Bind<IList<ITextExportService>>().ToMethod(ctx => 
{ 
    var services = new List<ITextExportService>(); 

    foreach (var device in GetDevicesByEnvironment()) 
    { 
     var service = ctx.Kernel.Get<ITextExportService>(new ConstructorArgument("hotFolder", ctx.Kernel.Get<IHotFolderManager>(
                    new ConstructorArgument("baseFolderPath", device.Path), 
                    new ConstructorArgument("defaultFileSearchPattern", "*.jmf")))); 

     services.Add(service); 
    } 
    return services; 
}); 

Ich vermute, das alles kommt von der Tatsache, dass ich nicht explizit haben eine selbst für ITextExportService registriert Bindung. Da die Implementierung jedoch von Daten aus App.config abhängig sein wird, kann ich nicht nachvollziehen, wie ich sie registrieren kann und nicht jedes Mal dieselbe Instanz erhalte, wenn ich nach einer Liste dieses Typs frage.

Antwort

1

Verwandte: Ninject different behaviour between Kernel.Get and Constructor Injection -> gibt es eine Diskrepanz mit, wie ninject verhält, wenn kernel.Get<IList<T>> und Auflösen eines IList<T> Parameter eines Ctor tun.

hier So geht es:

ninject der multi injection Funktion Priorität nimmt hier. Immer wenn ninject eine Anforderung für IEnumerable<T>, IList<T> oder T[] (aber AFAIR nicht ICollection<T>) findet, übersetzt es es in eine Anforderung, alle Bindungen (ohne Bedingung oder mit einer übereinstimmenden Bedingung) für T aufzulösen.

Versuchen auf die folgenden:

public interface INoMultiBindingList<T> : IList<T> { } 

public class NoMultiBindingList<T> : List<T>, INoMultiBindingList<T> { } 

mit:

sbb public ServiceSchedulerBuilder (INoMultiBindingList textExportServices) { textExportService = textExportServices;
}

Kernel.Bind<INoMultiBindingList<ITextExportService>>().ToMethod(ctx => 
{ 
    var services = new NoMultiBindingList<ITextExportService>(); 

    foreach (var device in GetDevicesByEnvironment()) 
    { 
     var service = ctx.Kernel.Get<ITextExportService>(new ConstructorArgument("hotFolder", ctx.Kernel.Get<IHotFolderManager>(
                    new ConstructorArgument("baseFolderPath", device.Path), 
                    new ConstructorArgument("defaultFileSearchPattern", "*.jmf")))); 

     services.Add(service); 
    } 
    return services; 
}); 
+0

Wow, sehr interessant. Es funktioniert, obwohl ich die konkrete 'NoMultiBindingList' benutzen muss, weil sie, wie definiert, nicht weiß, wie man von einer NoMultibindingList in INoMultibindingList konvertiert und Ninject ist unglücklich darüber. – Killnine

+0

Ich habe eine Bearbeitung vorgenommen, um von INoMultieBindingList zu erben, das das Problem behoben hat. – Killnine

+0

@Killnine Entschuldigung, ich habe vergessen, die Schnittstelle 'INoMultiBindingList ' zu 'NoMultiBindingList ' hinzuzufügen - deshalb wurde es nicht kompiliert. Ich habe den Code angepasst. EDIT: oops, sollte die Seite neu geladen haben bevor der Kommentar gepostet wird ;-) – BatteryBackupUnit

Verwandte Themen