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<>))
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:
Nun könnte es sein, dass Sie einige Klassen haben, für die Sie T
an IExtract gebunden haben möchten.
wo
%Vor%Sie können eine Konvention wie folgt angeben
%Vor% Wo GenericArgumentBindingGenerator
ist definiert als:
Die Antwort darauf scheint zu sein, dass es keine Möglichkeit gibt, dies mit Ninject zu tun.
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:
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%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 sindIch 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%Die Antwort darauf scheint zu sein, dass es keine Möglichkeit gibt, dies mit Ninject zu tun.
Tags und Links c# ninject constructor-injection