2013/11お楽しみはこれからだ!2013年11月27日水曜日DataAnnotationsModelValidatorProviderとマルチテナント1年に1回!そんな感じですけど、元気にやってます。マルチテナント花盛りですが、マルチテナントといってもシングルソースシングルデプロイDBが共有か個別かは、別パラメータで調整するのでもいいし。AppDomainにテナント固有コードいれるとかちょっとなんか本末転倒。シングルソースマルチデプロイこの場合デプロイのソース割合としては、カスタム2~3%で別アセンブリになってて、97~98%は共通コア。割合は適当だけど、そのくらいなら全然管理できるし落としどころとしてはいいんじゃないかと思う。マルチソースマルチデプロイこれが一番厳しいけどとりあえず動かす、っていうのなら、この辺。いうか運用がマルチテナントなだけでシステムはほぼ個別。コードも10%以上がカスタム。ソースをコピーしちゃってぜ、っていうパターン。良い悪いも視点しだいなんだけど、デベロップメント視点でいうと、マルチソースは避けたいところですね。「コードベースは簡単に再利用できるという発言はよく聞くけど、大きなサイトのコードが本当に再利用できるのは稀。同じコードベースでサイトを3つ運営できるようになったら、本当に再利用できるコードと言える。wazanova最近、必須項目を落としたいっていう"冗談は顔だけにしろよ"っていうオーダーが入ってですね、Validationルールどうしようか、天を仰いだんすよ。カスタムモデルも使えるようにはしてるけど、ちょっとそういうのなしね、っていうモデル。DBにべったりなモデル。テナントごとに調整できるようにしたのが、↓こんな感じのカスタムModelValidatorProvider。validators;}}太字のところ。GetValidatorsで対象の属性を除外してModelValidatorを抽出。普通にAttributeじゃなくてAdapterで丸めてるので、単純比較はできないんだけど、attributesから除外しちゃえばModelValidatorも除外されるから、あんまり気にしなくてもよろしですね。これを使うようにGlobal.asaxに登録。登録方法はApp_Codeに配置するなり(マルチデプロイの場合は)、なんだもいいんだけど。Nullableじゃない基本型の場合にRequiredを付与しないならfalseにしましょう。VoidDataAnnotationsModelValidatorProvider());}こんなのを書いて、標準のプロバイダーを差し替えましょう。差し替える上に、モデルクラスと無効にしたい属性を指定しておきましょう。AddRuleで除外したいものを登録するように書いたけど、そこはExpression使えたほうがなんかかっこいいから、ちょっとそんな雰囲気も出してみたよ。すると、この場合カスタムコードはGlobal.asaxのみ。デプロイアセンブリは共通がいいなら、App_Codeにコードファイルをコピーでデプロイ。どっちでも同じですね。これをVS2013でMVCプロジェクトを新規にテンプレートから作成したものに張り付けて動かすと、ユーザー登録のところで、ユーザ名必須が外れて、パスワード長の制限が外れて、パスワード確認用の一致チェックも外れる。登録自体には失敗するからね。それはバリデーションの位置が違うので今回はほっときます。わかりにくいけど↑こんな動き。