いい年こいて精神論でホッケーするのはバカらしいと思う今日この頃。.NETAOPフレームワークと言われるんだって。MVCでのFilterAttribute達のどっちかが一般的なのかと思ってたけど、世の中スゴイ事思いつく人たちがいるモンで、ビルド後にILを書き換えてフックポイントを追加してしまえばいいじゃないかという発想で作られてます。Emitにを超える黒魔術。ドキュメントに書かれてる実装パターン。}}Reflectorなんかでビルド後のアセンブリを見ると上記のパターンにそったものが出力されてるのが確認出来ます。ドキュメントを見つつ、どんなことが出来るのかチラッとコード書いてみたんです。}}最初から用意されてる便利クラス。OnExceptionAspectOnMethodBoundaryAspectOnMethodInvocationAspectOnFieldAccessAspectそれぞれ、だいたい名前の通り。引数や戻り値を書き換えたりも出来るよ!IOn~のインターフェースも用意されてるから、用意されてるのが気に入らないなら最初から実装してしまうのも可能。OnExceptionAspectについてはその他のクラスのOnExceptionでも取れるから単体で使う場面はそんなに無かったりするのかな~。属性クラスとしてAspectクラスを実装して、クラスやメソッド、フィールドに指定してビルドするのがオーソドックスな使い方だと思うけど、更に[assembly:自作Aspectクラス(~)]でBCLにゴッソリ指定出来たりするのが恐ろしい。気になってしかたがないのがCompositionAspect。Overflow前にも、この方法について考えたことがあって、その時はストラテジパターンを使ってDelegateでのコマンド振り分けでの実装をしてたんですが、少し前に違う方法を実装してるのを見て悔い改めたんです。MVCによく似合う方法は、属性ベースで対象となるアクションを振り分ける(判定する)方法ですよね。Method毎に処理を振り分ける事ができるのを上手く利用して、Submitの値毎に処理を振り分けるためにActionMethodSelectorAttributeを派生したSubmitCommandAttributeというのを定義していました。}}これだけなんですけども...。HttpPostのコードを参考に内部にAcceptVerbsAttributeを保持してPOST時のみをIsValidにしてますが、DeleteとPutも必要なら要修正。}}コントローラでこんな感じにアクションを定義しておいて、Viewを以下のようにしておきます。%></body></html>動かしてみると、最初に↓。ボタンが4種類出てきます。上2つはnameとvalueの異なるsubmitで、下2つがnameが同じでvalueが違うsubmit。上から順にボタンを押したのが↓。TempDataの値が違うのが確認できますね(ページ上部のH1)。ココまで書いときながら、前にどこで見たのかを検索して探し出してみてショック。Blogまんま、同じになるという大失態。年始からこんなコードを書いてて先が思いやられる...。かずきのBlog@Hatena正月から興味深いエントリですね。遅くなるのは毎回のCompileと引数に渡してるExpression生成ですかね。Compileはキャッシュしてしまえば毎回生成する必要は無いですが、そもそも以下のようにすることでCompileそのものが不要に。ラムダ式のBodyを取得する。}こうすると、実行時間は...。ノーマル:5msイケテル:3700msカイリョ:84ms※平均値じゃないですが。これを更に高速化しようとイロイロと試してみたんですが、どうやらExpression<Func<T>>の生成に時間を取られる模様。Name;と、しただけで実行時間はほぼ同じくらいかかるし。素敵じゃなくなるけど、↓こんな感じにしておくとちゃんと早い。}ノーマル:5msカイリョ:10msうむ。意味のないコードになってしまいました。年始からこれじゃ先が思いやられる...。