Ich baue Kerndienste für große App und wir wechselte von Burg Windsor zu Autofac. Alles funktioniert gut in der automatischen Registrierung mit assemly Scan und Module, aber wir haben in letzter Zeit interessante Fall: Es gab 2 Implementierungen von einer Schnittstelle und Autofac natürlich registrieren sie in zufälliger Reihenfolge, dass falsche Implementierung aus betriebswirtschaftlicher Sicht gelöst wurde. Natürlich macht die manuelle Registrierung den Job, aber es wäre schön, eine Validierung auf IContainer-Ebene zu haben, um zumindest Informationen über jeden einzelnen registrierten Service auszugeben und wenn es mehr als eine Implementierung hat, sollte er sie als Standard markieren - was sein wird behoben, wenn Container mit Auflösung abgefragt wird. Der Zweck besteht darin, Entwickler zu zwingen, eine bestimmte konkrete Implementierung zu registrieren, wenn mehrere verfügbar sind, die automatische Registrierung jedoch beibehalten wird.
Haben Sie einen Weg zu diesem Fall gefunden?Autofac Registrierungen Validierung
1
A
Antwort
0
public static class AutofacExtensions
{
/// <summary>
/// Checks if one implementation was chosen by developer for every interface
/// </summary>
/// <param name="container"></param>
public static void ValidateRegistrations(this IContainer container)
{
if (container == null)
{
throw new ArgumentNullException(nameof(container));
}
var registrations = GetRegistrations(container);
Validate(registrations);
}
static void Validate(IDictionary<Type, IList<Type>> registrations)
{
foreach (var registration in registrations.OrderBy(x => x.Key.FullName))
{
var unique = registration.Value.Distinct().Count();
if (unique > 1)
{
var all = registration.Value.Count;
if (all <= unique)
{
var currentImplementations = registration.Value.Distinct().Select(x => x.FullName);
var aggregatedImplementations = string.Join(", ", currentImplementations);
throw new InvalidOperationException($"IoC/DI: for type '{registration.Key.FullName}' was not chose default implementation! Registered available implementations: {aggregatedImplementations}");
}
}
}
}
static IDictionary<Type, IList<Type>> GetRegistrations(IContainer container)
{
var registrations = new Dictionary<Type, IList<Type>>();
foreach (var registration in container.ComponentRegistry.Registrations)
{
foreach (var service in registration.Services.OfType<IServiceWithType>().Where(x => x.ServiceType.Namespace != null && x.ServiceType.Namespace.ToLowerInvariant().StartsWith("flb.")))
{
IList<Type> implementations;
if (!registrations.TryGetValue(service.ServiceType, out implementations))
{
implementations = new List<Type>();
registrations[service.ServiceType] = implementations;
}
implementations.Add(registration.Activator.LimitType);
}
}
return registrations;
}
}
Verwandte Themen
- 1. Autofac Schlüssel Registrierungen
- 2. Überprüfen Sie Autofac-Registrierungen in einem Komponententest
- 3. Autofac und Keyed Registrierungen - das richtige Verhalten?
- 4. Autofac Konfiguration Validierung
- 5. Ist es möglich, Registrierungen zu einem Autofac LifetimeScope hinzuzufügen, nachdem es erstellt wurde?
- 6. Unity-Registrierungen überschreiben einander
- 7. NoMethodError in Registrierungen # Neu
- 8. IServiceGatewayFactory IOC-Registrierungen
- 9. Registrierungen nicht auflösbar
- 10. Autofac und Vertrag Klassen
- 11. Ereignis in Autofac registrieren
- 12. Autofac
- 13. .NET IOC-Container, der das Entfernen von Registrierungen ermöglicht
- 14. Notification-Hub-Registrierungen werden gelöscht
- 15. Autofac. Basisklasse Eigenschaften gelöst ohne spezifische Injektion
- 16. Autofac InstancePerMatchingLifetimeScope
- 17. Autofac entsorgen
- 18. Autofac-Clientkonfiguration
- 19. Autofac nicht auflösen kann DbContext
- 20. Temporäre Deaktivierung von Registrierungen in Devise
- 21. panic: http: mehrere Registrierungen für/debug/Anfragen
- 22. Einheit: Implizite ResolvedParameter für unbenannte Registrierungen
- 23. Rspec Fehler in Registrierungen Aktion des Gerätes
- 24. Laravel - Anzahl Registrierungen Status pro Ereignis
- 25. Autofac: Wie man mehrere Plugins trennt
- 26. Autofac Resolve CommandHandlers von spezifischen abgeleiteten Diensten
- 27. Autofac mit Owin
- 28. Autofac mit wcf
- 29. AutoFac: Inject Nullwerte
- 30. Instanz auflösen - Autofac
Heute fragte ich gleiche queation auf Github-Entwicklern, den Code, aber die Antwort ist „es wird nicht in der Basis api enthalten sein, weil es so viele Kernklassen Auswirkungen hat“, behauptet :(so gibt es einen Tipp für Sie und es gibt mindestens 2 Ansätze, um eine einfache Lösung zu erstellen: eine mit Reflektion und Zugriff auf private Strukturen und Felder und andere mit offiziellen API – Macko
Tun Sie was zu tun, solange Sie verstehen, die Informationen, die Sie erhalten, kann oder kann nicht genau sein die Gründe, die in [Autofac-Ausgabe # 853] beschrieben sind (https://github.com/autofac/Autofac/issues/853). –
Dank Travis, ich habe bereits eine schöne und einfache Erweiterungsmethode für IContainer vorbereitet, die Anmeldungen einfach zählen und Für einfache Registrierungen sieht es so aus, als ob es funktioniert. Ich lasse meinen Code w Ork für eine Weile und sehen, ob es komplexere Registrierungen verwaltet. – Macko