Frage

Ich kann meinen Kopf nicht durch den Parameter in AutoFAC bringen, der folgende Code funktioniert nicht:

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

Das wirft:

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.

Aber der folgende Code tut Arbeit:

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));
War es hilfreich?

Lösung

Wiederholen Sie hier die Antwort aus der AutoFAC -Mailingliste:

Die Parameter, die nur mit dem direkten Implementierer des von Ihnen behebenden Dienstes übergeben wurden. Die Parameter von Konfigurationen an den Auflösungsaufruf für Verbraucher funktionieren daher nicht. Der Weg um diese Weise besteht darin, Ihre Verbraucherregistrierung in:

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

Andere Tipps

AutoFAC versucht offensichtlich, den Parameter Ihrer Konfigurationsklasse in der Annahme zu beheben, dass das Wörterbuch selbst ein auflösbarer Typ ist. Ich kenne die AutoFAC -Syntax nicht, wie es geht. Aber wahrscheinlich müssen Sie bei der Registrierung des Konfigurationsarts mehr Schritte ausführen, z. B. einen Delegierten, der in einem neuen Wörterbuch besteht.

Leider ist IOC -Container wie Autofac nicht mit einem "Bitte lesen Sie mein Geistesmodul" aus.

Was Sie versuchen zu sagen, ist im Grunde zu sagen: "Ich weiß, dass einer der hier beteiligten Typen ein Wörterbuch benötigt, und ich brauche einen Dienst vom Typ Verbraucher. Können Sie bitte versuchen, herauszufinden, was ich nehme und nur nur mach das das Richtige?".

Wenn Sie einen Dienst auflösen und einen Parameter angeben, wird dieser Parameter für diesen bestimmten Dienst verwendet. Der Container versucht nicht, diesen Parameterwert auf Abhängigkeiten zu verbreiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top