私もあなたの立場にありましたが、それは難しいことだと思います。私の場合、クライアント向けのカスタムの単一製品サイトを構築していました。各サイトは同様のレイアウトとワークフローに従っていましたが、それぞれが完全にカスタム設計、配送とクーポンに関するカスタム ルール、および異なるマーチャント ゲートウェイと構成を持つために十分な柔軟性が必要でした。
数年後、私たちは保守可能なものにたどり着きました。まず、すべての共通コードを格納するライブラリを作成し、これらのライブラリを単純に Common と呼ばれる TFS プロジェクトに配置しました。次に、サイトごとに新しい TFS プロジェクトを作成し (多くのクライアントは複数の製品/サイトを持っていたため、クライアントではありません)、該当するプロジェクトを Common からそれらに分岐しました。次に、「デザインのない」ビュー、コントローラー、およびそれらのアクション メソッドを含む、サイトのスケルトンを含む VS テンプレート プロジェクトを作成しました (各サイトの基本フローは同じであることを思い出してください)。また、各サイトは独自のデータベースで実行されていました。このデータベースは、使用されていないほとんど空のテンプレート DB から複製されました。
各サイトが独自のブランチと DB で実行されているため、他のサイトに影響を与えることなく、テンプレートによってインストールされた元のフローと設計に変更を加えることができました (マージして戻す必要はありません)。送料計算などのビジネス メソッドをカスタマイズするために、共通クラスのサブクラスを作成し、必要に応じてオーバーライドすることができます。これを可能にしたのは、依存性注入を使用するようにすべてのコードを変換したことです。具体的には、各コントローラにサービスが注入され、各サービスにリポジトリが注入されました。Merchant Processing もインターフェイスにコーディングされ、注入されました。また、言及する価値があるのは、これにより、各サイトのすべてのアップセル ロジックをハードコーディングできることです (製品 X を購入したので、Y をお勧めします)。これは、古いアップセル ルール エンジンで複雑な構成ルールを定義するよりも、作成と維持がはるかに簡単でした。あなたにそんなものがあるかどうかはわかりませんが...
ときどき、共通コード自体に変更を加えたいと思うことがありますが、これは通常、特定のサイトの特定の必要性によって促されました。その場合、そのブランチで変更を行い、Common にマージしてから、都合のよいときに他のサイトにマージします (「重大な」変更または DB への変更も必要な変更に最適です)。同様に、DB の変更については、テンプレート DB を更新してから、他のサイト DB を同じスキーマ変更で更新するための小さなスクリプトを記述します (それでも、賢く慎重に行う必要がありました)。
追加の利点は、「デザイン」ビルド構成で使用/挿入されるモック リポジトリも作成したことです。これにより、デザイナーは、文字通りワークフローに自分自身を送信することなく、アプリケーションをジャンプして画面上で作業できるようになりました。また、バックエンドで何かが行われる前にサイトでの作業を開始することもできました。これは、「何かを見る」必要がある不安なクライアントにとって非常に重要でした.
10 人以上のクライアントは、あなたが話していることを考えると決して少数ではありません。3つでも十分苦痛でした。一度に 30 以上のサイトを運営し、3 人の開発者と 2 人のデザイナーが管理していました。
最後に、それがあなたの質問の範囲外であり、少しおこがましいことは承知していますが、デザイナーが実際に実装を開始する前に (そして開発者が作業を行う前に)、デザインに関する「最終的な」クライアント サインオフを取得することで、多くの費用を節約できました。やり直し。最終的な設計はないことは承知していますが、実装側の効率を高めることで、クライアントが承認した設計について考えを変える時間が少なくなりました。
少なくとも、考えるためのいくつかのアプローチが得られることを願っています。