5

私のチームのプログラマーは、トランザクションを開いて scope.Complete() ステートメントを含めるのを忘れることがあります (以下のコード ブロックを参照)。いずれかへの方法に関するアイデア

(1) scope.Complete() ステートメントが欠落しているソリューションを検索する、または

(2)scope.Complete()ステートメントの欠落をVisual Studioに自動的に強調表示または警告させますか?

見逃している行は次のとおりです。

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

私が試し
 
たこと この目的のために ReSharper Custom Pattern を使用しようとしましたが、うまくいきませんでした。理想的には、次のようなものを検索します。

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

ただし、ReSharper はステートメントではなく識別子の正規表現のみを受け入れるため、これは機能していないようです ( http://www.jetbrains.com/resharper/webhelp/Reference__Search_with_Pattern.html )。

何か案は?他のプラグインやツールの使用にもオープンです。

ありがとう、
ベン

4

3 に答える 3

4

プログラマーに、低レベルの scope.Complete の代わりにカスタム API を使用するように強制できますか?

閉鎖は以下の使用を強制します.Complete():

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

次に、次のことができます。

new TransactionScope().Do(() => /* Transactional stuff */);
于 2012-06-18T14:26:01.980 に答える
3

NDepend は確かに役に立ちますが、求めているものを 100% チェックすることはできません。NDepend は、メソッド本体の内部 (メソッド呼び出しの順序) について知りません。したがって、せいぜい、メソッドが を作成している場合、少なくとも を呼び出す必要があることを確認するLINQ (CQLinq) を介したコード ルールを作成できます。TransactionScopeTransactionScope.Complete()

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

開発者が 1 つのメソッドで複数のメソッドを作成しないよう十分に訓練されている場合はTransactionScope、このルールが機能するはずです。

于 2012-06-19T12:31:44.530 に答える
0

これをチェックする既存の R# プラグインは知りませんが、独自のプラグインを作成することはできます。必要なのは、その型の変数宣言を含む using ステートメントを検出し、含まれているステートメントを反復して呼び出しTransactionScopeを探すことだけです。Complete()

これに興味がある場合は、ReSharper SDKをダウンロードして、プラグイン開発ガイドを確認することをお勧めします。

于 2012-06-19T14:42:53.370 に答える