Ich habe eine Schnittstelle, Implementierung und Ziel bekommt:Wie man eine optionale Abhängigkeit in AutoFac macht?
public interface IPerson { public string Name { get; } }
public class Person: IPerson { public string Name { get { return "John"; } } }
public class Target { public Target(IPerson person) {} }
Ich Autofac mit Sachen zusammen zu binden:
builder.RegisterType<Person>().As<IPerson>().SingleInstance();
Das Problem ist, dass IPerson
Leben in einer gemeinsamen Versammlung, Person
lebt in einem Plugin (das kann oder darf nicht dort sein), und lebt in der Hauptanwendung, die Plugins lädt. Wenn keine Plugins geladen sind, die IPerson
implementieren, geht Autofac ballistisch davon aus, keine Target
Abhängigkeiten auflösen zu können. Und ich kann es nicht wirklich dafür verantwortlich machen.
Allerdings weiß ich, dass Target
in der Lage ist, den Mangel an IPerson
zu behandeln und würde mehr als glücklich sein, stattdessen eine null
zu bekommen. In der Tat bin ich ziemlich sicher, dass alle Komponenten, die auf eine IPerson
angewiesen sind, bereit sind, eine null
es stattdessen zu nehmen. Also, wie kann ich Autofac sagen - "Es ist OK Sweety, mach dir keine Sorgen, gib mir einfach eine null
, in Ordnung?"
Ein Weg, ich fand ist ein Standard-Parameter zu Target
hinzuzufügen:
public class Target { public Target(IPerson person = null) {} }
Das funktioniert, aber dann muss ich diese Komponenten für alle tun, die eine IPerson
erfordern. Kann ich das auch anders herum machen? Irgendwie sagen Sie Autofac "Wenn alles andere für die Auflösung IPerson
fehlschlägt, geben Sie null zurück"?
Siehe auch 'ResolveOptional()'. – abatishchev
Wenn 'Person' im Plugin lebt, wie können Sie es registrieren? Wohin geht dieser Anruf? 'builder.RegisterType() .As () .SingleInstance();' –
@SriramSakthivel - jedes Plugin hat eine 'Initialize (ContainerBuilder)' Methode, die von der Hauptanwendung aufgerufen wird. Plugins registrieren dort ihre Komponenten. –