2011-08-16 19 views
7

私は最近のインターセプタコンセプトに興味があります。私は、この概念がNHibernate、Entity Frameworkなどの多くのライブラリで使用されていることを知っています。しかし、私はASP.NET MVC Webアプリケーションでこのコンセプトを使用する方法に興味があります。Webアプリケーションでのインターセプタの使用方法と使用方法

ここでは、Mvc Webアプリケーションで使用すると便利ですか?

インターセプタを使用するオープンソースのAsp.Net Mvcプロジェクトはありますか?

Asp.net Mvcは既にフィルタを備えたコントローラ用のインターセプタをサポートしています。インターセプタの代わりにフィルタを使用する方が良いでしょうか?

+1

Dependency Injectionは、探している機能の中でより頻繁に使われる用語だから、 – thekip

+0

@thekip - 私はそれを認識しています。そこでiocタグを追加しました。 – AnyOne

+0

[AOP on .NET](http://www.sharpcrafters.com/aop.net)を探しているようですね。 –

答えて

0

もっと一般的なDIコンテナを使用して依存関係を注入するとします。これはあなたのコントローラへの依存性を注入するだけでなく、それらの依存性の依存関係を提供するので、依存するすべてのオブジェクトの完全なオブジェクトグラフになります。

フロントエンド用のDIコンテナを使用すると、バックエンドをより多くのユニットをテスト可能かつ疎結合にする良い機会ももたらされます。

+0

Heyyあなたはインターセプタについて何も言わなかった... – AnyOne

+0

DIコンテナとは対照的にインターセプタが提供できない機能は何も知らないのですか? – thekip

+0

DIコンテナのないインターセプタの純粋な使用を私の質問では意図していません。 – AnyOne

5

傍受は多くのもののために使用することができる - などの計測、ロギング、監査、セキュリティ、計量、

として横断的関心事あなたdon't need a DI Container to apply the conceptに対処するための最も注目すべき、それが役立ちます。

ASP.NET MVCフィルタを使用してほぼ同じ効果を得ることができますが、一般的に再利用可能な実装を適用することができるMVCフレームワークはなぜですか?

12

/ときに開発したコードを調べてきた以前のアプリケーションを見てみましょう

にインターセプタを使用します。メソッドとプロパティの最初または最後に頻繁に複製されるコードを探します。これは、これらすべてのメソッドからインターセプタに移行することを検討するコードです。例えば、私は、入力検証を行い、私のMVCのアクションの多くは、コードの同じ同じ数行でそうすることに気付きました:

if (!ModelState.IsValid) 
    return View(model); 

これは潜在的に迎撃に移動することができ、コード(おそらくMVCフィルタでありますこの場合)。フィルタを作成して適用するコストは、この重複したコードのコストを上回っていますか? (2行のコードとこれを使用するコントローラーアクションの数をかけたもの)。この場合、おそらくそうではありません。しかし、インターセプタを使用する利点がより大きくなる他の状況もあります。ここで

は私が発生する可能性があるコードの重複のこのタイプを想像して、いくつかの状況のリストです、すなわち 香りは、彼らがインターセプタから利益を得ることができるように シナリオこと:

  • 入力検証(上記示したように)。
  • デバッグログ。write an interceptorは、すべてのメソッド呼び出しの入り口と出口を記録できます。
  • スレッド同期。あなたの質問はWebアプリケーションに関するものですが、MVPスタイルのビューを持つWindowsアプリケーションを開発している場合は、すべてのメソッド呼び出しがUIスレッドに同期されるようにするインターセプタを適用できます。
  • データベーストランザクション。私のデータベースのトランザクションコードのほとんどは次のようになります。

 

using (var transaction = Session.BeginTransaction()) 
{ 
    // ... do some work that is unique to this method ... 
    transaction.Commit(); 
} 
  • PropertyChangedイベントの実装を。このコードは通常、非常に反復的で、書くのは面倒です。 Sacha Barber has thoroughly explored how to automatically implement this event using various frameworks
  • セキュリティ。アプリケーションには、特定のユーザーのみに制限する必要があるメソッドが多々あります。 The AuthorizeAttributeはまさにそのためのフィルタです。
  • Webサービス要求の調整。 BasecampのAPIのようなAPIの中には、特定の時間枠あたり特定の数の要求に対してlimit your requestsを要求するものがあります。 Basecampクライアントクラスを作成した場合は、インターセプタを適用して、必要に応じてThread.Sleepを使用して、すべてのメソッド呼び出しが速度制限を満たしていることを確認できます。
  • 結果キャッシュ。MVC has some filters pre-built for this purpose。 UIレイヤーの下のレイヤーの結果をキャッシュする独自のインターセプターを作成することができます。
  • WCFエラー処理。クライアントがFaultedの状態にある場合は、DisposeのWCFクライアントを使用できないため、クライアントのインスタンスを作成および破棄するすべてのメソッドで状態を確認し、クライアントの周りにusing句をラップするのではなく、必要ならばAbortを呼び出します。この場合、インターセプターが最適ではないかもしれません。それはおそらくより簡単でしょうto just fix the Dispose implementation or use some kind of wrapper

上記の例がインターセプタの候補になるかどうかは、アプリケーションの固有の複雑さによって異なります。もちろん、このリストは網羅的でもなくてもかまいません。インターセプタの可能なアプリケーションは、あなたが書いたアプリケーションほど多様です。コントローラ、サービス、およびドメインオブジェクト:私はあなたがインターセプタを適用するのが好きかもしれない三つの主要な場所を考えることができますどのようにインターセプタに

を使用する

MVCコントローラ

  • 、それは先に行くと、MVC's filtersを使用するのが最も理にかなっています。あなたのIoCコンテナの外に引き上げる中間層のサービスについては
  • 、(それはコントローラではないので)フィルタはオプションではありませんので、あなたはinterception features of your IoC containerを使用する必要があります。
  • ドメインオブジェクトの場合、通常はコンストラクタ(新しいエンティティの場合)または選択したORM(既存のエンティティの場合)からフェッチする場合は、を使用する必要がありますコンストラクタの代わりにオブジェクトファクトリinstruct your ORM how to use the factory

これを達成する方法の詳細は、使用しているツールによって異なります。

関連する問題