2009-08-24 10 views
2

開発者が特定の実行ポイントでコードを拡張できるようにしようとしています。特定のポイントでコードを挿入できるデザインパターン

私の具体的な例は、データベーストランザクションラッパーです。ラッパーは、開発者から抽象化したい多くの詳細を処理し、いくつかのプロジェクトで使用されます。

しかし、各プロジェクトでは、トランザクション中に自動的にやりたいことがいくつかあります。私は各プロジェクトがコードを実行するために設定できるインターセプトポイントを追加したいと思います。

たとえば、データベースの各テーブルには、レコードが変更されるたびに更新される[入力日]フィールドがあります。ただし、多くのレコードがタッチされた場合(つまり、テーブルAのレコードが4つ、テーブルBのレコードが1つ)、トランザクションのすべての日付が同じであることが必要です。

"TransactionStarting"、 "TransactionStarted"、 "StatementExecuting"、 "StatementExecuted"などのインターセプトポイントを定義し、各ポイントにコンテキストオブジェクトを渡すことを考えました。

プロジェクトでは、 "TransactionStarted"ポイント中に現在の日付を格納するクラス "EnteredDateManager"を定義し、 "StatementExecuting"ポイント中に各オブジェクトのEnteredDateプロパティを更新できます。

私はこれをweb/app.configファイルに設定し、複数のインターセプトクラスを登録できるようにしたいと考えています。複数のクラスが登録されている場合は、登録された順番で起動する必要があります。

私はイベントを起こすことを考えていましたが、私は秩序を築きたいと思っています。私はまた、異なるポイント間で状態を共有できるようにしたい。上記の例では、EnteredDateプロパティはTransactionStartedポイントに設定され、StatementExecutingポイントで使用されます。

これは責任パターンですか? AOP? ASP.Netパイプラインの仕組みに近いようですが、イベントを使用していて、私が知る限り発注を保証するものではありません。

いずれの方向/例も素晴らしいでしょう。

ありがとう

答えて

0

基本的な戦略パターンを使用する方法があります。 Strategyでは、元のクラスにロジックを直接実装するのではなく、クラスによって呼び出される個別のクラスに基本的に機能を追加しています。戦略クラスは、インタフェースベースのプロパティまたはコンストラクタ引数(またはその両方)を介して設定することによって、元のクラスに含めることができます。このようにして、ユーザは元のクラスによって定義されたいくつかの処理フローに異なるタイプの機能を注入することを選択できます。

0

これは.NET固有のものです(ASP.NETに言及した場合)、System.Transactions名前空間を調べて、トランザクションでリソースマネージャを作成して登録することを強くお勧めします。

TransactionScopeを使用すると、コンテキストでトランザクションを作成できます。そのコンテキスト内で実行されるリソースマネージャは、トランザクションの存在を検出して登録できます(TransactionStartイベントと同義です)。登録されると、各リソース・マネージャは、変更をコミットするか、トランザクションを取り消してロールバックを開始するかを選択できます。

.NET 2.0で導入されたSysten.Transactions名前空間は、トランザクションを作成し、トランザクションされたリソースを管理するためのかなり強力なツールを提供します。軽量トランザクション、またはMSDTCサービスによって管理される、より複雑で完全に分散したトランザクションの両方のオプションがあります。トランザクションは、単一フェーズ・コミット、または2フェーズ・コミットとすることができ、トランザクション障害にも柔軟に対応できます。

1

私にはアスペクト指向プログラミングのようなサウンドがあります。 PostSharpをチェックしてください。

public class TraceAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { Trace.TraceInformation("Entering {0}.", eventArgs.Method); } 

    public override void OnExit(MethodExecutionEventArgs eventArgs) 
    { Trace.TraceInformation("Leaving {0}.", eventArgs.Method); } 
} 

私はそれは、ロギング/トレース、キャッシングおよびパフォーマンスの監視を行うために使用します。

は、ここで彼らのウェブサイトからのトレースの例です。