2010-11-23 17 views
5

Ich habe eine Klasse, die ich als Deskriptor für ein Objekt verwende. In diesem Deskriptor gibt es mehrere Type Referenzen für Klassen, die für verschiedene Operationen mit diesem Objekt instanziiert werden sollen. Ich dachte daran, diese Referenzen herauszuziehen und sie durch Attribute der Deskriptorklasse zu ersetzen.Inelegant/falsche Verwendung von Attributen?

Daraus:

class MyDescriptor : BaseDescriptor { 
    public Type Op1Type { get; } 
    public Type Op2Type { get; } 
} 

Um dies:

[Op1(typeof(foo))] 
[Op2(typeof(bar))] 
class MyDescriptor : BaseDescriptor { 
} 

ich Attribute verwenden, sehr selten. Wäre das ein schlechter Gebrauch von ihnen?

+0

Haben Sie darüber nachgedacht, stattdessen Generics zu verwenden? – Lazarus

+0

Ein Problem besteht darin, dass Sie die Anforderung erstellen, den Typ zur Kompilierungszeit in der öffentlichen Schnittstelle zu kennen, wenn Sie Attribute verwenden. Die Verwendung virtueller Methoden ermöglicht die Verwendung von Typen, die bei der Kompilierung nicht bekannt sind. – CodesInChaos

+0

Die abgeleiteten Klassen können unterschiedliche Anzahlen von Operationen haben, so dass ich keine statische Anzahl generischer Parameter hätte. – redman

Antwort

0

Ich denke, das ist eine gute Verwendung von Attributen, vor allem, wenn Sie in der Lage sein möchten, die Dekorationsklassen durch Reflexion zu instanziieren, bevor Sie die Klasse, die sie dekorieren, instanziieren. Die Verwendung von Attributen bietet viele Vorteile, und dies ist nur einer davon.

Unabhängig von Ihrer Absicht sehe ich kein Problem mit der Implementierung.

+0

DI ist immer noch viel besser dafür. – Aliostad

0

Ich persönlich würde verwenden Dependency Injection statt Backen der Abhängigkeit in den Typ selbst bei kompilieren Zeit.

Ich kann keinen Nutzen sehen, den Sie erhalten können, indem Sie die Abhängigkeiten durch die Klasse in seinem Konstruktor instanziieren oder initialisieren.

Mit Dependency Injection können Sie dieses Verhalten zur Laufzeit ändern, zusätzlich zu der Möglichkeit, sie durch Dummy-Stubs/Mocks zu ersetzen.

+0

Ich bin ziemlich neu für DI, nachdem ich es nur bei meinem letzten Job gesehen habe. Ich fühle mich nicht wohl dabei, es in diesem Fall zu implementieren, aber ich werde Ihren Vorschlag als Ausgangspunkt für einige Forschungen zu diesem Thema verwenden. – redman

+0

Das ist so ziemlich, was Sie suchen. Verwenden Sie Unity, Castle, StructureMap oder andere und sehr einfach zu implementieren. – Aliostad

0

Ich sehe keine Probleme in der Art, wie Sie Attribute verwendet haben, aber ich sehe auch keine Vorteile, die Sie gewonnen haben. Vielleicht, wenn Sie mehr Informationen teilen, wäre es einfacher, eine Lösung zu finden.

+0

Wahr, kein greifbarer Vorteil von einem Codierungsstandpunkt. Der Vorteil, den ich erreichen möchte, ist vom Standpunkt der Konvention. – redman

0

Ich verwende so, wenn Sie angeben möchten, welche Art von zum Beispiel Hash-Algorithmus-Provider zu verwenden.

Die untergeordnete Klasse hat das Attribut, das von der übergeordneten Klasse gelesen wird und eine Instanz dieses Typs erstellt.

0

Attribute sind eine ziemlich elegante Art, dies im Quellcode auszudrücken, aber miserable Laufzeitleistung.

Sie sollten zur Laufzeit einen Cache erstellen, um schnell nachschlagen zu können, möglicherweise unter Verwendung von Dictionary<Type, Type>.

Verwandte Themen