2009-04-07 38 views
4

我想自定义属性应用到一些方法,指示他们应该作为一个事务处理。在一般情况下,我知道如何通过从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 
} 

如果保存数据( )方法抛出一个异常,那么我们会落在Using之外,并且scope.Complete不会被调用。

我不想要找到每一个实例,其中保存数据()被调用和手动添加使用语句周围的代码。我怎么能做一个导致这种行为的属性?

回答

4

Aspect.NET是另一个服务于同一目的的项目

7

基本上你想Aspect-Oriented Programming(AOP)。

看一看PostSharp - 它可以处理这口井。还有其他的选择,但我没有使用它们。

+0

诅咒你和你的快速发布,Jon Skeet !!! :D我有几乎完全相同的职位;我正在查找PostSharp的链接,现在已经完成了。 – Randolpho 2009-04-07 15:41:16