Domanda

Non riesco a capire il parametro che passa in Autofac, il codice seguente non funziona:

class Config {
    public Config(IDictionary<string, string> conf) {}
}

class Consumer {
    public Consumer(Config config) {}
}

void Main()
{
    var builder = new Autofac.Builder.ContainerBuilder();
    builder.Register<Config>();
    builder.Register<Consumer>();
    using(var container = builder.Build()){
        IDictionary<string,string> parameters = new Dictionary<string,string>();
        var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(parameters));
    }
}

che genera:

DependencyResolutionException: The component 'UserQuery+Config' has no resolvable constructors. Unsuitable constructors included:
Void .ctor(System.Collections.Generic.IDictionary`2[System.String,System.String]): parameter 'conf' of type 'System.Collections.Generic.IDictionary`2[System.String,System.String]' is not resolvable.

ma il seguente codice funziona :

IDictionary<string,string> parameters = new Dictionary<string,string>();
var config = container.Resolve<Config>(Autofac.TypedParameter.From(parameters));
var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(config));
È stato utile?

Soluzione

Ripetendo qui la risposta dalla mailing list di Autofac:

I parametri passati a Risolvi si riferivano solo all'implementatore diretto di il servizio che stai risolvendo, quindi passando i parametri di Config alla risoluzione chiamare per il consumatore non funzionerà. Il modo per aggirare questo è cambiare la registrazione del consumatore in:

builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 

Altri suggerimenti

Autofac sta ovviamente cercando di risolvere il parametro della tua classe Config supponendo che il Dizionario stesso sia un tipo risolvibile. Non conosco la sintassi di autofac su come farlo. Ma probabilmente è necessario eseguire ulteriori passaggi quando si registra il tipo di configurazione, e. g. assegnandogli un delegato che passa in un nuovo dizionario.

Sfortunatamente, i contenitori IoC come Autofac non sono dotati di un " per favore leggi il mio modulo mentale "

Quello che stai cercando di fare è fondamentalmente dire " So che uno dei tipi coinvolti qui ha bisogno di un dizionario e ho bisogno di un servizio di tipo Consumatore, puoi provare a capire cosa sto facendo prendere in giro e fare la cosa giusta ? " ;.

Se si risolve un servizio e si specifica un parametro, si tenterà di utilizzare quel parametro per quel particolare servizio. Il contenitore non tenterà di propagare quel valore di parametro fino a nessuna dipendenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top