2008-09-26 15 views
6

Ich weiß, es ist möglich, und ich habe einfache Beispiele in der Dokumentation gesehen, aber werden sie in der Wildnis verwendet?Gibt es ein praktisches Beispiel für die Verwendung von Attributen für Methodenparameter in .NET?

Ich benutze Attribute auf Klassen- und Methodenebene die ganze Zeit, aber habe sie nie auf Methodenparameter verwendet. Was sind einige Beispiele aus der Praxis und die Gründe für die Verwendung?

Ich bin nicht daran interessiert, ein Lehrbuch Beispiel zu sehen, wohlgemerkt. Es gibt viele von denen da draußen. Ich möchte einen tatsächlichen Grund sehen, warum es ein bestimmtes Problem für Sie gelöst hat.

EDIT: Lassen Sie uns die Diskussion darüber, ob Attribute zu verwenden oder nicht, beiseite legen. Ich verstehe, dass manche Leute sie nicht mögen, weil sie ihren Code "verschmutzen". Das ist für eine andere Diskussion!

+0

Macht nichts. Mein Beispiel hat gesaugt. Aber WCF tut dies. Ich habe es gesehen, ich kann gerade kein Beispiel finden. – Will

Antwort

9

Sie können beispielsweise für jeden Parameter ein ValidatorAttribute erstellen, bevor Sie die Methode aufrufen und die Parameterattribute widerspiegeln und die Parametervalidierung durchführen können. Dann rufe die Methode an, wenn alles in Ordnung ist.

+0

sehr interessant, ich habe nie gedacht, so zu verwenden. Nun, ich habe sie nie benutzt, aber egal. Bringt dich zum Nachdenken. – mattlant

+0

Sehr interessant. Ich mag es. – Kilhoffer

+0

sehr interessant und macht die Dinge robust, aber bringt das nicht auch viel Overhead? –

3

(Ich habe diese Antwort hier für den Fall hinterlassen, dass andere ein nützliches Intro zu PostSharp finden, aber es beantwortet die Frage nicht richtig! Ich habe die Frage falsch gelesen, da ich nach Methodenattributen anstatt nach Klassenattributen gefragt habe. Soweit ich mich erinnere, verwenden die generierten SOAP-Klassen Parameterattribute.LINQ to SQL verwendet Rückgabeattribute und kann auch Parameterattribute verwenden, wenn es zu gespeicherten Prozeduren kommt.)

Ich benutze sie mit PostSharp, obwohl zugegebenermaßen nur in eine schnelle Demo bisher (Ich habe PostSharp nicht in Produktion benutzt).

Weitere Informationen finden Sie unter my blog post.

Oh, und natürlich NUnit Tests angeben [Test] alle über den Ort :)

Jon

+0

Bei der Beantwortung dieser Frage haben Sie mich mit PostSharp bekannt gemacht. Sehr interessante Bibliothek, in der Tat. Vielen Dank! – Kilhoffer

+0

Schade, dass ich die Frage so schlecht beantwortete - hatte sie nicht richtig gelesen! Will jetzt bearbeiten ... –

+0

Eigentlich glaube ich nicht, Kilhoffer redete über Methodenattribute. Er spricht über Parameterattribute. – user9991

1

Dependency Injection ist ein sehr gutes Beispielszenario.

ObjectBuilder (ein abhängiger Injektionscontainer, ein Teil der P Enterprise Library, der bald durch Unity ersetzt werden soll) verwendet sie überall, um festzulegen, was der Container zur Laufzeit injizieren soll. Hier ist ein kurzes Beispiel des Konstruktor für eine Controller-Klasse, die einen Zustandswert hat (injiziert von was auch immer Zustand Provider aktiv ist, in der Regel Http) sowie zwei Service-Abhängigkeiten (a-Locator und eine Berechtigungsservice):

public class ShellController : ControllerBase, IShellController 
    { 
     public ShellController([StateDependency("State")] StateValue<ShuttleState> state, 
           [ServiceDependency] IHttpContextLocatorService contextLocator, 
           [ServiceDependency] IAuthorizationService authService) 
      : base(state, contextLocator, authService) 
     { 
      // code goes here 
     } 
} 
0

Unit Test Frameworks verwenden sie umfassend:

Um etwas in nUnit oder MSTest zu tun, müssen Sie Methoden mit einem [TestFixture] oder [TestClass] -Attribut schmücken.

Mein Favorit? MbUnit-Attribut [DataFixture]: Ermöglicht es, Testfälle mit bestimmten Testdaten entweder direkt im Attribut oder in einer externen Ressource zu testen.

+0

Das sind Klassen- oder Methodenattribute, nicht Methodenparameterattribute, wie er gefragt hat. Ein Unit-Test-Beispiel wäre das MbUnit Column-Attribut (http://code.google.com/p/mb-unit/source/browse/trunk/v3/src/MbUnit/MbUnit/Framework/ColumnAttribute.cs). –

Verwandte Themen