Kann ich Ninject ConstructorArguments mit starker Benennung verwenden?

8

Nun, ich weiß nicht, ob "starke Benennung" der richtige Ausdruck ist, aber was ich tun möchte, ist wie folgt.

Zur Zeit verwende ich ConstructorArgument wie z. das:

%Vor%

Wenn ich jetzt den Parameter "name" umbenenne (z. B. mit ReSharper), wird das ConstructorArgument nicht aktualisiert, und ich erhalte einen Laufzeitfehler beim Erstellen des Ninja. Um das zu beheben, muss ich manuell alle Orte finden, an denen ich diesen Parameter durch ein ConstructorArgument angegeben habe, und sie aktualisieren. Nicht gut, und ich bin irgendwann zum Scheitern verurteilt, obwohl ich eine gute Testabdeckung habe. Umbenennen sollte eine billige Operation sein.

Gibt es irgendeine Möglichkeit, dass ich stattdessen einen Verweis auf den Parameter machen kann - so dass er aktualisiert wird, wenn ich den Parameter umbenenne?

    
stiank81 14.04.2010, 11:21
quelle

3 Antworten

5

Wenn Sie mehr von dem teilen können, was Sie wirklich erreichen wollen, erhalten Sie eine bessere Antwort. Im Allgemeinen möchten Sie sich nicht darauf verlassen, ein ConstructorArgument überhaupt zu übergeben, wenn Ihnen geholfen werden kann - es sollte ein letzter Ausweg sein, um einen Parameterwert in die Erstellung einer Komponente einzupassen, die Sie nicht besitzen und auf die Sie sich daher nicht verlassen können während der Refactoring-Aktivitäten [wie] willy nilly umbenannt werden. Also für normalen Code, wenn Sie versuchen können, es an Schnittstellen zu halten, um Dinge eindeutig zu machen und sich nicht auf die Namen zu verlassen, die besser sind.

Ich kann jetzt kein Beispiel ausgraben, aber es gibt ein ziemlich allgemeines Idiom namens statische Reflexion . Ein mitgeliefertes KonstruktorArgument kann mit jedem Parameter dieses Namens über alle Konstruktoren übereinstimmen, so dass die statische Reflexion in dieser Instanz nicht am besten geeignet ist.

Daher ist das Beste, was Sie mit der statischen Reflexion wahrscheinlich erreichen können, etwas wie:

%Vor%

Das typische Beispiel, das Sie sehen, ist, wo Sie den Namen einer Eigenschaft extrahieren möchten, auf die in einer Instanz zugegriffen wird. Dies ist ein wenig anders, da es an einem Konstruktoraufruf-Ausdruck arbeiten muss.

Um eine passende Lib zu finden, die bereits genau das hat, trainieren Sie für den Sucher: D (Aber ich würde vorschlagen, einen besseren Weg zu finden, was Sie tun möchten, das ConstructorArgument sowieso nicht diesem Ansatz vorzieht .)

    
Ruben Bartelink 14.04.2010, 12:30
quelle
4

Wie Sie bereits bemerkt haben, ist dieser Ansatz sehr fragil und sollte vermieden werden. Versuchen Sie einen Entwurf, bei dem Sie den Namen nicht als Konstruktorargument hinzufügen müssen. Sie könnten dies zum Beispiel tun:

%Vor%

Ich hoffe, das hilft.

    
Steven 14.04.2010 12:03
quelle
0

Ja, das kannst du.

Ich habe das ergänzt:

%Vor%

Es ist ohne LINQ, aber es ist ein guter Ausgangspunkt, um zu verstehen, wie es funktioniert.

    
MikroDel 20.02.2013 12:48
quelle