そして、2番目と3番目の質問について。
私が気づいた3つの流暢なパターン
1 つ目は、using ステートメント (C# 2.0) を使用して、特定のコンテキストでコードを実行します。次に例を示します。
using(var transaction = new Transaction())
{
// ..
// ..
}
これは、Transaction のコンストラクターとディスポーザーを使用してトランザクションを設定し、このコンテキストでコードを実行します。
2 番目はほとんど同じことを行いますが、ラムダでは、これはたとえば Rhino モックでよく使用されます。
(new Transaction()).Run( () => mycode(); );
最もよく知られている流暢なインターフェイスは、戻り値の型を使用してメソッド呼び出しをチェーンすることです。ほとんどのメソッドはこれを返すため、同じオブジェクトの呼び出しを連鎖させることができます。ただし、呼び出されたメソッドに応じて、異なるオブジェクトを返してコンテキストを変更することもできます。トランザクション内でのみ実行できるオブジェクトがある場合 (申し訳ありませんが、別の例を思いつきません)、疑似コードで call run と stoptransaction を実行できる初期化されたトランザクションを返す StartTransaction メソッドをオブジェクトに与えることができます。
class Runner
{
Transaction StartTransaction()
{
return new Transaction(this);
}
}
class Transaction
{
Transaction Run()
Transaction StopTransaction()
}
呼び出しがどのように見えるか
var runner = new Runner();
runner
.StartTransaction()
.Run()
.StopTransaction();
もちろん、あらゆる種類のエラー処理などを追加する必要があります。