Как контролировать поведение метода через атрибут? - PullRequest
4 голосов
/ 07 апреля 2009

Я хотел бы применить пользовательский атрибут к некоторым методам, который указывает, что они должны обрабатываться как транзакция. В общем, я знаю, как создавать пользовательские атрибуты путем наследования от System.Attribute, но я не знаю, как делать то, что мне нужно.

Моя цель примерно такая:

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

Атрибут TransactionalMethod () заставит метод вести себя так, как если бы он был заключен в TransactionScope ...

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

Если метод SaveData () выдает исключение, мы бы вышли за пределы использования, и область видимости.Комплект не был бы вызван.

Мне не нужно искать каждый экземпляр, в котором вызывается SaveData (), и вручную добавлять в него код Using. Как я могу создать атрибут, который вызывает такое поведение?

Ответы [ 2 ]

7 голосов
/ 07 апреля 2009

В основном вы хотите Аспектно-ориентированное программирование (AOP).

Посмотрите на PostSharp - он справится с этим хорошо. Есть и другие варианты, но я ими не пользовался.

4 голосов
/ 09 апреля 2009

Aspect.NET - это еще один проект, который служит той же цели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...