2009-04-07 8 views
4

Ich möchte auf einige Methoden ein benutzerdefiniertes Attribut anwenden, das angibt, dass sie als Transaktion behandelt werden sollen. Im Allgemeinen kann ich benutzerdefinierte Attribute erstellen, indem ich von System.Attribute erben, aber ich weiß nicht, wie ich das mache, was ich brauche.Wie man das Methodenverhalten über ein Attribut steuert?

Mein Ziel ist es so etwas wie diese:

[TransactionalMethod()] 
public void SaveData(object someObject) 
{ 
    // ... maybe some processing here 
    // ... then the object gets saved to a database 
    someObject.Save(); 
} 

Die TransactionalMethod() Attribut würde die Methode verhalten, als ob es in einer Transaction gewickelt wurde ...

try 
{ 
    using(TransactionScope scope = new TransactionScope()) 
    { 
     SaveData(someObject); 
     scope.Complete(); 
    } 
} 
catch 
{ 
    // handle the exception here 
} 

Wenn die Savedata () Methode löst eine Exception aus, dann würden wir außerhalb des Using fallen und der scope.Complete würde nicht aufgerufen werden.

Ich möchte nicht jede Instanz finden müssen, wo SaveData() aufgerufen wird, und manuell den Code Using Anweisung um ihn hinzufügen. Wie kann ich ein Attribut erstellen, das dieses Verhalten verursacht?

Antwort

4

Aspect.NET ist ein anderes Projekt, das den gleichen Zweck dient

7

Grundsätzlich wollen Sie Aspect-Oriented Programming (AOP).

Werfen Sie einen Blick auf PostSharp - es kann damit gut umgehen. Es gibt auch andere Möglichkeiten, aber ich habe sie nicht benutzt.

+0

Verflucht Sie und Ihre schnelle Veröffentlichung, Jon Skeet !!! : D Ich hatte fast genau den gleichen Posten; Ich habe den Link zu PostSharp gesucht, und da bist du schon fertig. – Randolpho

+0

Es gibt ein paar URLs, die ich kenne, ohne sie nachzuschlagen, und postsharp.org ist einer von ihnen :) –

Verwandte Themen