Ho un interfaccia, implementazione e di destinazione:Come creare una dipendenza opzionale in AutoFac?
public interface IPerson { public string Name { get; } }
public class Person: IPerson { public string Name { get { return "John"; } } }
public class Target { public Target(IPerson person) {} }
sto usando Autofac per legare insieme le cose:
builder.RegisterType<Person>().As<IPerson>().SingleInstance();
Il problema è che IPerson
vive in un assembly condiviso, Person
vive in un plugin (che può o non può esserci), e Target
vive nell'applicazione principale che carica i plugin. Se non ci sono plugin caricati che implementano IPerson
, Autofac diventa irritato per non essere in grado di risolvere le dipendenze di Target
. E non posso davvero biasimarlo per quello.
Tuttavia so che Target
è in grado di gestire la mancanza di un IPerson
e sarebbe più che felice di ottenere un null
invece. In effetti, sono abbastanza sicuro che tutti i componenti che si basano su un IPerson
sono pronti a prendere il numero null
. Quindi, come posso dire ad Autofac: "Ok, dolcezza, non ti preoccupare, dammi solo un null
, va bene?"
Un modo che ho trovato è quello di aggiungere un parametro predefinito per Target
:
public class Target { public Target(IPerson person = null) {} }
che funziona, ma poi ho bisogno di fare questo per tutti i componenti che richiedono un IPerson
. Posso fare anche il contrario? In qualche modo dire ad Autofac "Se tutto il resto fallisce per risolvere IPerson
, restituire null"?
Vedere anche 'ResolveOptional()'. – abatishchev
Se 'Person' vive nel plugin, come puoi registrarlo? Dove va questa chiamata? 'builder.RegisterType() .As () .SingleInstance();' –
@SriramSakthivel - ogni plugin ha un metodo 'Initialize (ContainerBuilder)' chiamato dall'applicazione principale. I plugin registrano i loro componenti lì. –