Ninject Injektion aller Instanzen eines generischen Typs mit Ninject

8

Ich möchte in der Lage sein, ninjects zu verwenden, um alle Instanzen eines bestimmten generischen Typs in eine Klasse zu injizieren. Zum Beispiel habe ich eine Reihe von benutzerdefinierten Extraktoren im Format:

%Vor%

und ich möchte alle Instanzen dieser Extraktoren in eine Klasse injizieren, die für die Verarbeitung dieser Datei unter Verwendung der Mehrfachbindung von ninject verantwortlich ist.

dh

%Vor%

In der Vergangenheit habe ich dies getan, indem ich eine Managementklasse (IProvideExtractors) hatte, die direkt auf den Kernel zugreift, aber ich mag diese Methode nicht und frage mich, ob jemand einen besseren Weg kennt, dies zu tun. Mit ninject multiple binding kann ich dann alle Instanzen erreichen, die an kernel.GetAll(typeof(IExtract<>))

interessiert sind     
Luke McGregor 07.06.2012, 20:25
quelle

3 Antworten

4

Ich habe nach etwas ähnlichem gesucht: Ich wollte nicht alle Bindungen separat unter Verwendung der Konventionserweiterung angeben.

Erstens: Sie müssen List<IExtract> injizieren und IExtract<T> : IExtract erben. Das liegt einfach daran, dass Sie in C # nicht den Typ einer Sammlung angeben können, die andere Generika enthält. Wie Sie in Ihrer Frage notiert haben, handelt es sich um eine ungültige Syntax - aus einem guten Grund, der über diese Antwort hinausgeht.

Sie können später die Elemente von IExtract aus der Liste ziehen und mit reflection den generischen Paramer-Typ abrufen und zurückwerfen. Oder wenn Sie wissen, für welchen Extraktor Sie suchen:

%Vor%

Nun könnte es sein, dass Sie einige Klassen haben, für die Sie T an IExtract gebunden haben möchten.

%Vor%

wo

%Vor%

Sie können eine Konvention wie folgt angeben

%Vor%

Wo GenericArgumentBindingGenerator ist definiert als:

%Vor%     
Tarion 14.12.2013, 11:25
quelle
2

Die Antwort darauf scheint zu sein, dass es keine Möglichkeit gibt, dies mit Ninject zu tun.

    
Luke McGregor 18.06.2012 09:18
quelle
1
___ answer0939538 ___

Option A

Ich bin mir ziemlich sicher, dass Sie das tun können:

%Vor%

Und dann listet Ihre Bindungen in der Load -Methode Ihres Bindungsmoduls auf:

%Vor%

Und NInject liefert sie an Ihren Konstruktor, der eine Abhängigkeit von einer Reihe von ihnen ankündigt. Das habe ich in der Vergangenheit mit Erfolg gemacht.

Option B

Ändern

%Vor%

bis

%Vor%

Was würde erlauben:

%Vor%

zu sein:

%Vor%

Und die NInject-Bindungen würden ebenfalls angepasst:

%Vor%     
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entworfen wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ qstnhdr ___ Ninject Injektion aller Instanzen eines generischen Typs mit Ninject ___ qstntxt ___

Ich möchte in der Lage sein, ninjects zu verwenden, um alle Instanzen eines bestimmten generischen Typs in eine Klasse zu injizieren. Zum Beispiel habe ich eine Reihe von benutzerdefinierten Extraktoren im Format:

%Vor%

und ich möchte alle Instanzen dieser Extraktoren in eine Klasse injizieren, die für die Verarbeitung dieser Datei unter Verwendung der Mehrfachbindung von ninject verantwortlich ist.

dh

%Vor%

In der Vergangenheit habe ich dies getan, indem ich eine Managementklasse (IProvideExtractors) hatte, die direkt auf den Kernel zugreift, aber ich mag diese Methode nicht und frage mich, ob jemand einen besseren Weg kennt, dies zu tun. Mit ninject multiple binding kann ich dann alle Instanzen erreichen, die an %code%

interessiert sind     
___ answer20582683 ___

Ich habe nach etwas ähnlichem gesucht: Ich wollte nicht alle Bindungen separat unter Verwendung der Konventionserweiterung angeben.

Erstens: Sie müssen %code% injizieren und %code% erben. Das liegt einfach daran, dass Sie in C # nicht den Typ einer Sammlung angeben können, die andere Generika enthält. Wie Sie in Ihrer Frage notiert haben, handelt es sich um eine ungültige Syntax - aus einem guten Grund, der über diese Antwort hinausgeht.

Sie können später die Elemente von %code% aus der Liste ziehen und mit reflection den generischen Paramer-Typ abrufen und zurückwerfen. Oder wenn Sie wissen, für welchen Extraktor Sie suchen:

%Vor%

Nun könnte es sein, dass Sie einige Klassen haben, für die Sie %code% an IExtract gebunden haben möchten.

%Vor%

wo

%Vor%

Sie können eine Konvention wie folgt angeben

%Vor%

Wo %code% ist definiert als:

%Vor%     
___ tag123ninject ___ NInject ist ein Abhängigkeits-Injection-Framework für .NET-Anwendungen. ___ tag123constructorinjection ___ Konstruktor Injection ist die Dependency-Injection-Methode, bei der die Abhängigkeiten eines Objekts an seinen Konstruktor übergeben werden. ___ answer11079936 ___

Die Antwort darauf scheint zu sein, dass es keine Möglichkeit gibt, dies mit Ninject zu tun.

    
___
bluevector 07.06.2012 20:41
quelle