2010-11-23 3 views
1

私はMVC2 Webアプリケーションを持っています。これは、ユーザーによる一意のログインの数を記録する必要があります。ユーザーがログインするたびに、データベースにレコードが保存されている必要があります。ちょうど時間、日付などのような基本。MVCでのイベントのロギング - どのアプローチが最適ですか?

特定のActionResult(つまりユーザーログオン)にケースのみを記録するという要件がある場合、レコードをデータベースに送信するカスタムコードを記述するだけでいいですか?

また、後で(クライアントと同じように)自分の考えを変えることの実績があるとすれば、もう少し堅牢なものを作成して使用する方がよいでしょうか?

最後にLog4Netを代わりに使用するのはどうですか?最初の要件が1つのアプリケーションの1つの小さな部分にのみ焦点を当てるとすれば、それは後でもっと拡張可能かもしれませんが、過剰なものでしょうか?

アドバイスと活発な議論が評価されました。

+0

あなたは 'SqlMembershipProvider'を使用していますか? –

+0

はい。私のコメントは15文字でなければならないので、もう一度 "はい"と答えてください。 –

答えて

1

SqlMembershipProviderを使用しているので、最も簡単なことはupdate triggeraspnet_Membershipテーブルに追加することです。 LastLoginDateが更新されると、トリガーは別のトラッキングテーブルにデータを入力できます。 FailedPasswordAttemptCount列を使用して、失敗したログインの試行を追跡する場合も同じことができます。

ユーザーが正常に日付にサインイン、最後のアクティビティの日付と最後に検証されています。これらのフィールドは、ユーザがログインすると、SqlMembershipProvider.ValidateUser方法のマニュアルを参照してください更新方法の詳細については

値はデータベース内の現在の日付と時刻に更新されます。

ValidateUserメソッドに間違ったパスワードが入力された場合、無効なパスワードの試行を追跡する内部カウンタは1だけインクリメントされます。

一般的にロギングに関しては、ロギングフレームワークを使用することができますが、私はNLogを提案します。

+0

それは賢明な考えです。それを考慮していなかった。 –

1

あなたが説明する必要性は、アプリケーション/ドメインイベントに最適なようです。

ユーザーがログインすると、イベント(ユーザーがログインしている)が発生したことを通知するためにアプリケーション全体のイベントを発生させる必要があります。 "イベント"はメッセージですが、私は常にこれらのデータを何の振る舞いも持たずに(通常は完全に公開されている)データバッグとして書き込みますが、通常、ハンドラに必要なすべてのコンテキスト(データ)レコードID)。

別途、データベースに関連情報を記録するイベントのハンドラを記述します。ハンドラは、単一の責任を持つクラスでなければなりません。イベントに応答してより多くのアクションを実行する必要がある場合は、個々のハンドラとして実装します。

次に、アプリケーションの起動時のどこかで、アプリケーション/ドメインのイベントを受信するためにハンドラを配線する必要があります。

このパターンをサポートするために必要なインフラストラクチャコードが少しありますが、DI/IoCコンテナによってしばしば大きく助けられるシンプルで短いコードでなければなりません。 Googleドメインのイベントの場合は、実装の例が多数あります。

このアプリケーション/ドメインイベントパターンは、例外的にはという強力なイベントです。このパターンを採用すると、コードが大幅に改善されました。 既存のコードのを変更せずにシステムの動作を拡張するほうがずっと簡単で、その例では、ユーザーをログインさせるコードと統計情報を記録するコードの明確な箇所がカプセル化されていますアプリケーションログイン。

最後に、私はこれにLog4Netを使用しません。イベントを実装する場合、ハンドラは非常にシンプルで直感的ですが、永続性を実行するためにLog4Netを磨くようにしようとすると、あなたはあなたのツール(Log4Net)と少なくともいくつかのそれを使用しないだけで完全に回避することができます。

+0

良いアドバイス:Log4Net。実際にアプリにログインする必要が明白でない限り、私はそれが落とされたと考えています。アーキテクチャーはこれがアプリケーション全体のイベントであると判断します。それは現在、一つの別個の機能であるもののための多くの仕事のように思えます。 –

+1

これは1つの離散関数にとどまることはありません。私がこれまでに開発したすべての基幹業務アプリケーションは、これらの小さな機能の多くから始まります。そして、正直なところ、アプリケーション全体のイベントの実装を非常にシンプルにすることができます。中央イベントハブを実装することは毎回大盛りです*。 –

関連する問題