C# - 如何检查缺少scope.Complete()语句?

时间:2012-06-18 14:20:28

标签: c# resharper qa ndepend

我团队中的程序员有时会打开一个事务而忘记包含scope.Complete()语句(参见下面的代码块)。任何想法的想法

(1)搜索我们的解决方案是否缺少scope.Complete()语句,或

(2)让Visual Studio自动突出显示或发出缺少scope.Complete()语句的警告?

这是我们想念的那条线:

 using(TransactionScope scope = new TransactionScope())
 {
      /* Perform transactional work here */
      scope.Complete(); <-- we forget this line
      /* Optionally, include a return statement */
 }

我尝试了什么

我尝试过使用ReSharper自定义模式,没有运气。理想情况下,我会搜索类似的内容:

using(TransactionScope scope = new TransactionScope())
{
    $statements1$
    [^(scope.Complete();)]
    $statements2$
}

但是,ReSharper只接受标识符的正则表达式,而不接受语句,因此这似乎不起作用(http://www.jetbrains.com/resharper/webhelp/Reference__Search_with_Pattern.html)。

有什么想法吗?我也愿意使用其他插件或工具。

谢谢,

3 个答案:

答案 0 :(得分:4)

您是否可以强制程序员使用自定义API而不是低级范围。完整的东西?

关闭将强制使用.Complete()

public static void Do(this TransactionScope scope, Action action) {
  using (scope) {
    action();
    scope.Complete();
  }
}

然后你可以这样做:

new TransactionScope().Do(() => /* Transactional stuff */);

答案 1 :(得分:3)

NDepend肯定有帮助,但不能100%检查你要求的东西。 NDepend不知道方法体内部(方法调用的顺序)。所以充其量,你可以写一个code rule over LINQ (CQLinq)来检查一个方法是否正在创建TransactionScope,至少它必须调用TransactionScope.Complete()

warnif count > 0
from m in Application.Methods
where m.CreateA("System.Transactions.TransactionScope") &&
     !m.IsUsing("System.Transactions.TransactionScope.Complete()")
select m

请注意,如果开发人员足够严格以避免在一种方法中创建多个TransactionScope,则此规则应该适用于您。

答案 2 :(得分:0)

我不知道有任何现有的R#插件可以检查这个,但你当然可以自己创建一个。您所要做的就是检测带有TransactionScope类型的变量声明的using语句,然后迭代包含的语句,查找Complete()调用。

如果您对此感兴趣,建议您下载ReSharper SDK并查看Plugin Development Guide