増刊号この広告は、90日以上更新していないブログに表示しています。MVCを使ってみた感想等について書いてみます。想定StackOverflow.comのアーキテクチャ記事っぽく書こうかと思ったけど、そもそもまだ稼働してないサイトなんで、ページビューとか書けないし簡単なソフトウエア構成だけ。MVCに限らずWebアプリでは一般的なプラクティスだったりするわけで、さほど特徴的なこともしていないんですが、以下、個別のトピックについて書いてみます。一般的に、使うテクノロジーによって、3層の各レイヤが薄くなったりすることもありますが。SQLという階層構成にしています(・ω・)Controllerに書くのはヴァリデーションやService層の呼び出し、その結果をViewModel(Modelをそのまま使う場合もあり)にぶち込むと言ったグルーなコードだけで、「処理を書くの禁止」っという基本。́д`;)よく雑誌とかで、MVCフレームワークとは、みたいな入門記事が定期的に載るけどさ。́ω`)単純なデータ処理についてはこの階層構造で処理するで良いんだけどさ、やっぱ多少複雑なロジックを扱うところについては、賢いモデルを作った方が自然な作りになるよね〜、っつって。ちなみにDIは未使用です。簡易サービスロケータみたいなものを作って、アプリケーション固有のControllerFactoryあたりで処理するような感じで間に合わせています(・ω・)レイヤスーパータイプの用意Controllerとか、アプリケーション固有のフックを入れる場所としてレイヤスーパータイプを用意。SQLで楽チンぽん(・∀・)っというか、今回ほとんどSQL書いてないですね。́д`)GroupJoin()やSelectMany()が複数出てくると慣れないうちは戸惑うことも多いですが、SQLと対応づけて考えられるようになればどうということも無く。゚д゚)まあ、結局その処理は使ってないんだけど。́д`;)あと、テストに当たっては大量のテストデータ(っと言っても、せいぜいユーザ15,000件とそれに紐付く数十万件のデータですが)が必要と言うことで、ランダムでそれっぽいばらつきを持ったテストデータを作成するプログラムも作っています(・∀・)後は、データアクセスではなくモデルの話になりますが。LINQで生成されたいくつかのモデルについては、導出項目的なプロパティや処理については、partialで処理を追加しています。あと、ヴァリデーションについては独自のライブラリを使っているので、モデルのコードで定義するのではなくて、別途ルールを定義しています。ルーティングfaviconのignoreとかを追加したくらいで、他はほとんど基本パターン{controller}/{action}/{id}で済んじゃいました(・ω・)まあ、リソース指向を踏まえてURL設計したり、それと相性の良いDB設計をしているからだけど。́)あと、リソースを特定するパラメータについてはルートで、更新用のデータについてはPOSTで、検索系のパラメータについてはGETでと、使い分けもちゃんとしています。ViewModelの使用Controllerとビュー間のデータのやりとりについては、ViewModelクラスを用意しています(一部L2Sのモデルをそのまま利用している所あり)。ViewDataの使用とかはまったく無しで、全て型付けしたViewPageを利用(・∀・)あと、ViewModelクラス他は個別に名前空間をImportするのではなく、Web.configで指定。マッピングマッピングが必要なケースはほとんどなかったので、ライブラリとかは未使用です。マッピングがあったのは、ViewModelから検索パラメータへの詰め替えが少しくらい(・ω・)?Areaを使用ユーザ機能と管理機能でAreaを分割。ArchitectureにあるAreaViewEngineを使用しています。Formsでという考えもありますが(・ω・)まあ、今回は管理といっても、サマリの参照みたいな機能がメインなので、管理機能もMVCで実装しました。参照系ページの一部はOutputCacheを使用しています。ベンチを取ってみたら、キャッシュを使わなくても思ったより良い数字が出ていたり、DBを見てもそもそもデータサイズが最大数百MBくらいにしかならないので、キャッシュのヒット率とかもほぼ100%で推移してくれるているわけですが。ビューレベルでの出力キャッシュを使うと、他の細かいチューニングがどうでも良くなるほどパフォーマンスが良くなるわけで*2、静的コンテンツに近い参照系のページはキャッシュしています。拡張メソッドの利用HtmlHelper、UrlHelperについて、アプリケーション固有な拡張メソッドを用意しています。MVC的なやりかたでやっても良い部分があったかも。いうか、まだ時間的余裕はあるので、少し見直してみようかな(・ω・)?ユーザコントロール複数機能で同じ構成の画面要素については、ユーザコントロール化してHtmlHelper.RenderPartial()。́д`)ヴァリデーションヴァリデーションはDataAnnotationsとかではなく、自前で用意したものを使用。ヴァリデーションについてはこの前少し書いているので、そちらを参照。認証はMemberShipProviderではなくて、独自のMemberShipProviderみたいなものと、専用のFilterで対応。́д`;)その他の作成したMVC拡張アプリケーション固有のControllerFactory、ViewEngineの他に、認証用のIAuthorizationFilterなんかを作っていますが。その他のものとしては、form内の複数ボタンに対応するためのActionMethodSelectorAttribute派生だとかを作っていたり(・ω・)後は、ActionResult派生としてCsvResultやXmlResultみたいなものを用意しました。その他トピックその他、今回のシステムでやっている特殊なこととしては、Flashとの通信やPDF出力なんかがあります。Flashとの通信については、FlashからはHTTPServiceを使用して処理をリクエストする形で。リクエストのパラメータについては、FlashからPOSTされた値をControllerでModelとして受け取り、レスポンスについては、オブジェクトをXmlSerializerでXMLに変換して返すXmlResultを用意してそれを利用しました。POSTとXMLによる応答で処理しました。Railsなフレームワークとかと比べても。*3拡張ポイントも十分だしね。LL陣営から見ると、アプリケーションをさくっと作るにはコンポーネントが不足している感じかもしれませんが(・ω・)個人的には、8割の要件にそのまま使えるコンポーネントよりも、多少コードを書いても適用範囲の広いライブラリの方が欲しいので、その辺りは特に文句は無いですが。後は、ヴァリデーション周りはもっと強化されても良いかな〜、っというのは1つ。MVC自体の話ではなくて、データアクセスの話になりますが。SQLの更新系を強化するような方向で、SQLを意識できる選択肢も残しておいて欲しいな〜というような所です。́ω`)まあ、色々と他のライブラリなんかも使っていきたいと思います(・∀・)MVCContribとかも、もう少し活用したいし。́д`;)AreaViewEngineを使ってViewsフォルダが階層化していたり、ControllerやModelはWebとは別のプロジェクトにしていたりで、そのままだとうまく動かないところがあったので。後は、今回はほぼ必要なかったけど、マッピングを多用するならAutoMapperとか。́)ところで、また新しい.NETのお仕事の話があるわけですが。*51,000台くらいの機器と通信するサーバアプリと、そのユーザインタフェースとなるWebシステムみたいな構成で。Formsで行くってところかな(・ω・)サーバアプリの方は、キュー制御、スレッド制御、通信とかが絡んでくるので、自分がメインでやるんだろうけど。Frameworkのお仕事ではなく別のお話。)はてなブログをはじめよう!machi_ponさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。