我想将自定义属性应用于某些表明应将其作为事务处理的方法。一般来说,我知道如何通过继承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()方法抛出异常,那么我们将不在“使用”范围内,并且不会调用scope.Complete。
我不想找到调用SaveData()的每个实例,并手动添加代码使用它周围的语句。我怎样才能创建导致此行为的属性?
答案 0 :(得分:7)
基本上你想要Aspect-Oriented Programming(AOP)。
看看PostSharp - 它可以很好地处理这个问题。还有其他选择,但我没有使用它们。
答案 1 :(得分:4)
Aspect.NET是另一个服务于同一目的的项目