Autofac parameterlose Konstruktorauswahl

8

"Autofac wählt automatisch den Konstruktor mit den meisten Parametern aus, die aus dem Container abgerufen werden können." Ich möchte es anders machen und stattdessen den Standardkonstruktor wählen. Ссылка

%Vor%

Wenn ich den Kurs verdrahte, habe ich Folgendes getan:

%Vor%

Die erste Bindung in der Liste constructorBindings ist immer diejenige mit dem Konstruktor parameterless. Nicht sicher, ob es zuerst definiert wurde oder wie Autofac die Konstruktoren abtastet, aber ist dies der richtige Ansatz für den parameterlosen Konstruktor?

Danke

    
sheldon_cooper 21.12.2012, 10:22
quelle

3 Antworten

6

Autofac verwendet intern die Methode Type.GetConstructors , um die Konstruktoren zu ermitteln.

Aus den Methoden Dokumentation :

  

Die GetConstructors-Methode gibt keine Konstruktoren in a zurück   bestimmte Reihenfolge , z. B. Deklarationsreihenfolge. Dein Code darf nicht abhängen   in der Reihenfolge, in der Konstruktoren zurückgegeben werden, weil diese Reihenfolge   variiert.

Es war also nur Glück, dass es in Ihrem Fall mit der First() funktioniert hat. In einer geeigneten Implementierung müssen Sie explizit nach dem Konstruktor mit 0 Argumenten suchen:

%Vor%

Sie können die Theorie mit dieser sehr einfachen Klasse testen:

%Vor%

Mit Ihrer Implementierung:

%Vor%

Er gibt 22 aus. Der Konstruktor mit dem Argument int wird aufgerufen:

Mit meiner Implementierung:

%Vor%

Er gibt 1 aus, z. B. wird der Standardkonstruktor aufgerufen.

    
nemesv 21.12.2012, 14:42
quelle
1

Wäre es nicht einfacher, den Standardkonstruktor explizit zu registrieren?

%Vor%     
Jim Bolla 21.12.2012 15:16
quelle
1

Bei neueren Versionen von Autofac ist das sehr einfach:

%Vor%

Aufruf von "UsingConstructor" ohne Parameter bedeutet "parameterlosen Konstruktor verwenden". Siehe Ссылка und zugehörige Seiten.

    
AFract 29.05.2017 10:14
quelle

Tags und Links