2012-12-27 14 views
5

Ich brauche, von einer IComponentContext, eine Liste der registrierten Type, die eine bestimmte Schnittstelle implementieren.Holen Sie sich alle registrierten Implementierungen einer Schnittstelle in Autofac

Ich möchte keine tatsächlichen Instanzen der Typen, sondern eine Liste von Type von denen ich Instanzen erhalten konnte.

Ich möchte diese Liste verwenden, um Abonnements auf einem Nachrichtenbus zu generieren.

Wie bekomme ich alle registrierten Implementierungen einer Schnittstelle in Autofac?

+1

Haben Sie versucht, mit Reflection alle Typen innerhalb einer Assembly zu durchlaufen und zu überprüfen, ob sie 'IComponentContext' implementieren? Siehe [Alle Typen abrufen, die eine Schnittstelle mit C# 3.5 implementieren] (http://stackoverflow.com/questions/26733/getting-all-types-that-implement-an-interface-with-c-sharp-3-5) –

+0

@NikolayKhil Das ist nicht die Frage. Ich muss durch den Kontext schauen und registrierte Typen finden. Dies ist eine Autofac-spezifische Frage. –

Antwort

13

Ich dachte, dies heraus -

var types = scope.ComponentRegistry.Registrations 
    .SelectMany(r => r.Services.OfType<IServiceWithType>(), (r, s) => new { r, s }) 
    .Where(rs => rs.s.ServiceType.Implements<T>()) 
    .Select(rs => rs.r.Activator.LimitType); 
+0

ServiceType hat keine Implementierungsmethode! –

+1

Es funktioniert immer noch mit dem neuesten Autofac. –

0

Mit Autofac 3.5.2 (basierend auf diesen Artikel: http://bendetat.com/autofac-get-registration-types.html)

zuerst diese Funktion implementieren:

using Autofac; 
    using Autofac.Core; 
    using Autofac.Core.Activators.Reflection; 
    ... 

     private static IEnumerable<Type> GetImplementingTypes<T>(ILifetimeScope scope) 
     { 
      //base on http://bendetat.com/autofac-get-registration-types.html article 

      return scope.ComponentRegistry 
       .RegistrationsFor(new TypedService(typeof(T))) 
       .Select(x => x.Activator) 
       .OfType<ReflectionActivator>() 
       .Select(x => x.LimitType); 
     } 

dann übernehmen wir haben builder,

var container = builder.Build(); 
using (var scope = container.BeginLifetimeScope()) 
{ 
    var types = GetImplementingTypes<T>(scope); 
} 
Verwandte Themen