Question

Je n'arrive pas à comprendre le paramètre qui passe dans Autofac, le code suivant ne fonctionne pas:

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));
    }
}

qui jette:

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.

mais le code suivant fonctionne :

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));
Était-ce utile?

La solution

Répétez ici la réponse de la liste de diffusion Autofac:

Les paramètres passés à Resolve concernent uniquement l'implémenteur direct de le service que vous résolvez, donc passer les paramètres de Config à la résolution appel à consommateur ne fonctionnera pas. La solution consiste à modifier votre inscription de consommateur en:

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

Autres conseils

Autofac essaie évidemment de résoudre le paramètre de votre classe de configuration en supposant que le dictionnaire lui-même est un type pouvant être résolu. Je ne connais pas la syntaxe autofac pour savoir comment le faire. Mais vous devrez probablement faire plus d’étapes lors de l’enregistrement du type de configuration, e. g. en lui donnant un délégué qui passe dans un nouveau dictionnaire.

Malheureusement, les conteneurs IoC tels qu'Autofac ne sont pas équipés d'un "Veuillez lire mon module d'esprit".

Ce que vous essayez de faire est essentiellement de dire "Je sais que l’un des types impliqués ici a besoin d’un dictionnaire, et j’ai besoin d’un service de type Consommateur. Pouvez-vous essayer de comprendre ce que je suis prendre et faire juste la bonne chose ? ".

Si vous résolvez un service et spécifiez un paramètre, ce paramètre sera utilisé pour ce service particulier. Le conteneur n'essaiera pas de propager cette valeur de paramètre jusqu'à une dépendance quelconque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top