2012-01-14 10 views
4

私は、顧客に販売されるコマースサービスである大きなASP.NET MVCサイトに取り組んでいます。私たちは大部分が小規模および大規模な機関に販売していますので、シュリンクラップの規模ではありません。これらの大規模な顧客は、サイトに合わせてレイアウトをカスタマイズすることを含め、主に幅広いカスタマイズを行うように求めています。フォークなしで顧客固有のビューのカスタマイズをサポートするためのASP.NET MVC 3サイトを設計する

私たちの現在の考えは、MVCを使用しても、他のコードを呼び出すような非常にシンプルなコントローラでは(推奨されているように)自然な結論に至っても、ビューは非常に問題になります。いずれにしても私たちが使用していたようなRazorではない。それらをサブクラス化して「この顧客のために少し余分なことをする」と言うのは難しいです。特に、同じ構築物に対してわずかに異なるHTMLを提供することは困難です。

マルチテナントとシングルテナントのどちらかの作業をきれいに行うことはできません.1人以上の顧客のカスタマイズが徹底していても、コードベースをフォークすることは望ましくありません。 (可能な限り、すべての顧客に同型のデータベース構造を維持したいと思っていますが、マルチテナントの場合はそれを行う方法ですが、すべてのテナントは規模の面で独自のIIS Webサイトでなければなりません。分離)。カスタムビューのレイヤーをオーバーレイする方法を考え出しても、ビュー内でわずかなロジックの不一致が生じる可能性があります。

これを行う方法の現在の状態は?戦争の話は何ですか? (これは主観的なものかもしれませんが、これを本質的に完全に打ち消すパターンやアプローチがあれば、それは正しい答えです)。

私は午前中です詳細を提供して幸いです。

+0

アップデート:これまでもこれをレビューしており、その間に他のアーキテクチャ上の問題を修正しています。私は何をすべきかを決めるまでにまだ答えを受け入れようとしています。 – Jesper

+0

さらに別のアップデート:まだこの段階には達していません。私は彼らがどのようにそれを行うスタック交換を求めることを考えているので、彼らは私たちの問題は、同期機能のセットを除いて正確にあることを私に打つ。私は答えを選ぶことを控えているわけではないので、個人的な経験に基づいたものであり、非常に具体的な助言を得ているというメリットについて、私は@ tvanfossonの答えを受け入れましたが、いずれにしてもこれを再評価する必要があるでしょう。 – Jesper

答えて

1

最近、5つのリージェンツの機関をサポートするサイトを開設しました。成長する可能性は低い固定された顧客層があるため、いくつかの選択肢はありません。たとえば、顧客ごとに個別のデータベースインスタンスがあります。明らかにそれは非常にうまくスケールされませんが、モデルを大幅に簡素化してくれています。私が使用した

戦略は以下のとおりです。機能や構成、ない顧客に

  1. フォーカス。私たちには、各機関のための一連のコア機能があります。これらの機能のうち、カスタマイズ可能な機能はごくわずかです。各機関について、カスタマイズ可能な機能の選択肢を含むWeb.Configトランスフォームを維持しています。公開設定は、その機関のアプリを公開する際に使用されるトランスフォームを制御するために使用されます。ビュー/コントローラは、構成データを使用して、その施設に指定された機能のバリアントを実装します。それはどの機関であるか分からず、設定が「ウィジェットCをレンダリングするときにBの代わりに行う」と言うだけです。

  2. 共通テーマとサイト固有のコンポーネントにテーマを分けます。ほとんどのCSS /画像はすべての機関に共通ですが、サイト固有のCSSを読み込んで、最後に特定のサイトの上書きを許可します。これは、主に色、背景、施設固有の画像(バナーなど)です。サイト固有のテーマは、content/themesの別のフォルダに配置します。構成アイテムはテーマフォルダを設定するために使用され、マスタービューはCSSのURLを構築するときにこの設定項目を取り込みます。サイトの特定のイメージ(サイトCSSファイル自体ではほとんどがすべてではないにしてもほとんど)が処理されます。

  3. 標準構成をラップする強固な構成クラスを維持します。コンフィグレーションが必要な場合は、コントローラ、メーラなどにこのクラスを注入します。アプリケーション全体の構成に依存しているため、モデル内のファーストクラスのエンティティにこれをプロモートすることは、可読性とメンテナンス性にとって重要でした。非バイナリオプションの場合、通常、文字列の比較を避けるために設定にマップするenumsを作成します。より複雑なアプリケーションまたはより多くの機関のために、私は別の設定セクションハンドラを開発し、設定をそれ自身のセクションまたは設定ファイルに分けることさえあるでしょう。現時点では、設定の数が少なく、比較的単純なので、私たちはappsettingsを使用しています。

希望します。

+0

ありがとう、それは非常に有用です。それは100%適用されるものではありません。なぜなら私たちは機関の「鎖」を別々の顧客として得ることができるからです。その点では静的性の贅沢はありませんが、アドバイスのほとんどが依然として適用されます。特に、アイデンティティのカスタマイズから、フィーチャーを分離することについてのビット(顧客が時々採用したり落とす可能性がある)。コードやレイアウトのカスタマイズが要求されなくても、私たちは異なる支払い処理のアイデンティティと、確かに施設の名前と住所などの基本的なものを必要とします。私たちはこれらすべてのものを統一することを検討します。 – Jesper

1

マルチテナントのビューを見たいと思うようですが、a good article on the subject by Rob Ashton a while agoがありました。

+0

+1。これはうまく見え、サポート負担を最小限に抑えたという結論にすでに一致しています。もしRobが(私が今調べている)カテゴリにもっとヒントがあれば、これは私たちが望むものかもしれません。 – Jesper

+0

IIRC彼はトピックでミニシリーズをやりましたが、彼のサイトでは見つけるのが少し難しいです。おそらく、Twitterで彼に尋ねてみてください。 – ilivewithian

+0

ああ、インターネットアーカイブ、私はあなたを愛している方法を数えることができます:http://web.archive.org/web/20100909182628/http://www.codeofrob.com/category/10.aspx – Jesper

関連する問題