Holen Sie Sich Alle Typen, Die Eine Schnittstelle Implementieren, In Der Einheit

Überspringen Sie bitte die UPDATE-wenn Sie möchten, nur wissen die Lösung:

Ich habe eine Anwendung, die den folgenden code zu erhalten, und ausführen einer Anzahl von worker-Methoden

var type = typeof(IJob);
var types = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(x => x.GetTypes())
                .Where(x => x.IsClass && type.IsAssignableFrom(x));

foreach (Type t in types)
{
    IJob obj = Activator.CreateInstance(t) as IJob;
    obj.Run();
}

Dieser code funktioniert perfekt, wie Sie ist. Jedoch, einige der neueren Arbeitsplätze nutzen, dependency injection, um das ausfüllen Ihrer Konstruktoren mit dieser Methode wird nicht tragfähig sein für die Zukunft. Also ich Frage mich, ob es einen Weg gibt, dies zu tun mit der Einheit?

Mein ursprünglicher Gedanke war, dass ich weiterhin mit der ersten Hälfte und ersetzen Sie dann die foreach-Logik mit der Entschlossenheit, so dass es aussieht etwas wie das folgende.

var type = typeof(IJob);
var types = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(x => x.GetTypes())
                .Where(x => x.IsClass && type.IsAssignableFrom(x));

foreach (Type t in types)
{
    IJob obj = Container.Resolve(t) as IJob;
    obj.Run();
}

Das problem ist, dass sobald ich definiere meine UnityContainer die zurückgegebenen Typen-Liste, die zur Umsetzung von IJob wird plötzlich aufgebläht, mit all diesen Müll von Microsoft.Praktiken-Klassen wie unten gezeigt

Holen Sie Sich Alle Typen, Die Eine Schnittstelle Implementieren, In Der Einheit

UPDATE:

Es stellt sich dann heraus, wenn refelecting über Baugruppen, wenn die Einheit vorhanden ist, wird er versuchen zu reflektieren, die in der Einheit s-Assemblys, die, wenn Abgeschlossen, mit einer ToList wird eine Ausnahme aufgrund einer fehlenden Metadaten Erweiterung der IServiceLocator. Um dies zu umgehen Anhängen einer where-Klausel nach GetAssemblies() zu begrenzen Umfang Ihrer gewünschten namespace wird damit die Anwendung ordnungsgemäß ausgeführt.

var type = typeof(IJob);
var types = AppDomain.CurrentDomain.GetAssemblies()
                .Where(x => x.FullName.StartsWith("YourNamespace"))
                .SelectMany(x => x.GetTypes())
                .Where(x => x.IsClass && type.IsAssignableFrom(x));

foreach (Type t in types)
{
    IJob obj = Container.Resolve(t) as IJob;
    obj.Run();
}
  • Ich bin mir nicht ganz sicher, wie Sie Schnittstellen in Ihrem types Liste - bitte könnten Sie klarstellen, was genau ist den "meine Art zurückgeben" du redest?
  • Natürlich. Ich im Grunde zu wollen, ziehen Sie alle Typen, die Umsetzung IJob ruft dann Ihre Methode ausführen. Das problem ist, dass aus irgendeinem Grund, wenn ich versuche, dies zu tun mit dem container der var-Typen zurückgegeben wird, die aufgebläht ist mit einer Reihe von Microsoft.Praktiken.Einheit geben Sie Verweise, die nicht umsetzen, IJob. Welche, um ehrlich zu sein, ich verstehe nicht, wie das möglich ist
  • Kannst du bitte das Ergebnis zeigen die von types.ToList().Count()? Ich vermute, dass sich der screenshot, den Sie geschrieben ist, nicht die Liste die du suchst...
  • Ich denke, man kann auf etwas zu sein. Wenn ich das von toList auf, die verursacht, die eine Fertigstellung meiner Abfrage VS warf die folgende Fehlermeldung -- kann Nicht laden Sie eine oder mehrere der angeforderten Typen. Abrufen die LoaderExceptions-Eigenschaft für mehr Informationen. -------------------------------- > {"Konnte nicht geladen, Datei oder assembly 'Microsoft.Praktiken.ServiceLocation, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' oder eine Ihrer Abhängigkeiten. Das system kann nicht die angegebene Datei gefunden werden.":"Microsoft.Praktiken.ServiceLocation, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"}
  • So dachte - Sie waren auf der Suche bei pre-gefiltert innere Liste von "Denen", die in der Tat zeigt alle Typen. Auch so etwas erwartet, Sie werden immer problem mit dem laden einiger Typen - sollten Sie wirklich ablegen Linq und manuell Durchlaufen Baugruppen/Typen vorsichtig mit try/catch-code, um jeden.
  • Sehr richtig. Im Grunde, wenn das reflektieren über Geben .Netto landet das ziehen in Unitys Umsetzung der IServiceLocator, die ist, was bewirkt, dass meine Anwendung zu ersticken... stackoverflow.com/questions/10050027/... ...... , Der Artikel erklärt es. Vielen Dank für Ihre Hilfe!

InformationsquelleAutor Jon Gear | 2015-02-13
Schreibe einen Kommentar