2009-02-26 10 views
1

背景:LINQの監査と、現在のユーザー

私は、挿入のためのデータベース監査を行うために必要のあるWebアプリケーションを持っている/ /削除、更新(そしておそらく読み込み)。私はORMとしてLINQを使用します。 Webで見つけたアイデアをいくつか使用して、関連する監査テーブルを持つエンティティを装飾するために属性を使用する方法を考え出しました。監査表自体には、現行ユーザーのIDと名前、変更タイプ、変更時刻、および操作が成功したかどうかのフィールドに加えて、元の表と同じタイプの同じ列を含める必要があります。監査はSubmitChanges中に行われます。私のデータコンテキストは抽象であり、私は具体的な実装でSubmitChangesを継承して上書きします。抽象データコンテキストは、DataContextを拡張し、現在のユーザIDと名前のプレースホルダを持つCurrentUserプロパティを追加するAbstractAuditableDataContextから実際に派生します。デフォルトでは、ログインしているユーザーがいない場合、たとえば、ユーザーテーブルの特定のフィールドが更新されたときに登録またはログイン中に、0と "システム"が表示されます。アプリケーションは、ASP.NET MVCを使用してC#で記述されています。

問題:

私の派生データコンテキストの現在のユーザーのプロパティを移入するための最良の方法は何ですか? CurrentUserが設定されているかどうかを確認するAuditUtilityに注入されるユーティリティクラスを作成する必要がありますか?そうでなければ、それを埋め込みます。テストのために、私はこれをモックしますが、ライブアプリケーションではおそらく遅延セッションでロードして取得/設定します。または、この機能を実行するために(すべてのコントローラで使用される)データコンテキストファクトリを変更する必要があります。私はすでに単体テスト時にモックファクトリを使用していますので、新しいクラスを作成する必要はありません。あるいは、派生は工場外で行い、現在のユーザはコンテキスト作成中に注入するべきです。これは、私が "代わって"監査を行うことを可能にします。

私はこれがやや主観的であることを認識していますが、あなたが貢献する可能性のある考え/経験を感謝します。

ありがとうございました。

答えて

0

現在のデータコンテキストを取得し、HttpContext.User.Identityの現在のユーザー名に対応するユーザーオブジェクトを取得するGetAuditUserメソッドを持つCurrentUserUtilityBaseクラスを作成しました。このオブジェクトを使用して、現行ユーザーのIDおよび表示名を抽出し、これらのプロパティーを含むAuditUserオブジェクトを作成して戻します。

私の実装クラスは、自分のデータコンテキストのインスタンスを取得するためにファクトリを使用し、このデータコンテキストで基本クラスメソッドを呼び出します。私のデータコンテキストのファクトリメソッドは、現在のユーザユーティリティを使用して、コンテキストの現在のユーザを作成後にコンテキストに注入します。

0

DataContext(Application、Session、Request、BusinessObject ..あたりの)の有効範囲は何ですか?それが異なる場合は、現在のユーザーをDataContext内にキャッシュする(または作成中に設定する)ことは望ましくない場合があります。おそらく、DataContext内のPropertyを使用して、現在のユーザーをセッションから(必要なときはいつでも)取り出すことができます。

+0

データコンテキストスコープはアクション単位であり、かなり短命です。 – tvanfosson

1

Windowsまたはフォーム認証を使用している場合は、何も渡さずにHttpContextをチェックできます。ウェブコンテキストにいない場合は、スレッドからユーザーを取得します。多分:

if(HttpContext.Current != null) 
{ 
    //grab the user from the HttpContext 
} 
else 
{ 
    //grab the user from the Thread 
} 
+0

しかし、あなたはこのコードをどこに入れますか?データコンテキストを作成するとき、またはユーティリティが呼び出されるたびに? – tvanfosson

+0

最小抵抗のパスがSubmitChanges()実装に追加されている可能性があります。これにより、何かを渡す必要がなくなり、DataContextのコンシューマは、細部に無頓着なままです。 –

1

System.Threading.Thread.CurrentPrincipalあなたが探している答えを与える必要があります。

関連する問題