2016-06-15 10 views
0

Bei der Montage implementieren Ich habeWie registrieren Plugins, die A0 mehrere Schnittstellen über SimpleInjector

public interface IC { 
... 
} 

public interface IA : IC { 
FuncA(); 
} 

public interface IB : IC { 
FuncB(); 
} 

Bei der Montage A1 I

public class C1 : IA, IB { 
... 
} 

Bei der Montage A2 habe ich haben

public class C2 : IA, IB { 
... 
} 

In Montage A3 Ich habe

public class C3 : IA { 
... 
} 

Ich möchte alle Implementierungen der Schnittstelle und IB in allen Baugruppen registrieren. Dies kann über das Plugins-Beispiel unter Registering plugins dynamically erfolgen.

var pluginAssemblies = from file in new DirectoryInfo(pluginDirectory).GetFiles() 
where file.Extension.ToLower() == ".dll" 
select Assembly.LoadFile(file.FullName); 

var pluginTypesIA = container.GetTypesToRegister(typeof(IA), pluginAssemblies); 
var pluginTypesIB = container.GetTypesToRegister(typeof(IB), pluginAssemblies); 

container.RegisterCollection<IA>(pluginTypesIA); 
container.RegisterCollection<IB>(pluginTypesIB); 

Wie kann ich sicherstellen, dass Abhängigkeiten von IEnumeralbe<IA> und IEnumerable<IB> die gleiche Instanz für C1 und C2 in diesen beiden Sammlungen zurückkehren? Wie kann ich sicherstellen, dass C1 und C2 als Lifestyle.Singleton registriert sind?

Ich habe auch versucht mit dem Beispiel für Register multiple interfaces with the same implementation und Batch/Automatic registration aber ich Ausnahmen auf container.Verify() bekommen zu arbeiten, weil es diese Schnittstelle klagt IA bereits registriert ist und ich brauche container.RegisterCollection statt zu nennen.

Wenn mich jemand in die richtige Richtung führen kann, wäre das toll.

+0

Welche registriert wird, die Lebensstil sollte werden diese Instanzen? – Steven

+0

@Steven Lifestyle.Scoped oder Lifestyle.Singleton. Ich habe eine Reihe von Plugins ähnlich zu dem, was ich in der Frage beschrieben habe, die Scoped sein müssen und eine andere Reihe von Plugins, die Singleton sein müssen, die zwei Sätze implementieren verschiedene Schnittstellen, so dass ich leicht herausfinden kann, welche. Ich habe vergessen zu erwähnen, dass IA und IB beide von einem gemeinsamen Schnittstellen-IC stammen. Wird die Frage aktualisieren. – user2321864

Antwort

2

Sie können sie registrieren alle als mit dem folgenden Code scoped:

var pluginAssemblies = 
    from file in new DirectoryInfo(pluginDirectory).GetFiles() 
    where file.Extension.ToLower() == ".dll" 
    select Assembly.LoadFile(file.FullName); 

var registrations = (
    from assembly in pluginAssemblies 
    from type in assembly.GetTypes() 
    where !type.IsAbstract 
    where typeof(IA).IsAssignableFrom(type) || typeof(IB).IsAssignableFrom(type) 
    select Lifestyle.Scoped.CreateRegistration(type, container)) 
    .ToArray(); 

container.RegisterCollection<IA>(registrations.Where(Implements<IA>)); 
container.RegisterCollection<IB>(registrations.Where(Implements<IB>)); 

private static bool Implements<T>(Registration r) { 
    return typeof(T).IsAssignableFrom(r.ImplementationType); 
} 
Verwandte Themen