クライアントごとにコア製品を簡単にカスタマイズおよび拡張できるようにする方法について、いくつかのアドバイスを探しています。おそらく大きすぎる質問だと思います。ただし、この設定を間違えると、何年にもわたって問題が発生する可能性があるかのように、実際にいくつかのアイデアを得る必要があります。既存の製品のカスタマイズや拡張の経験はあまりありません。
私たちは通常、クライアントごとにオーダーメイドのコア製品を持っています。最近、MVC3フロントエンドを使用してC#4で製品を書き直しました。リファクタリングを行い、ソリューションを構成する3つのプロジェクトがあります。
- コアドメインプロジェクト(名前空間-projectname.domain。*)-ドメインモデル(EFで使用)、ドメインサービスインターフェイスなど(リポジトリインターフェイス)で構成されます
- ドメインインフラストラクチャプロジェクト(名前空間-projectname.infrastructure。*)-ドメインサービスを実装します-EFコンテキスト、リポジトリの実装、ファイルのアップロード/ダウンロードインターフェイスの実装など。
- MVC3(namespace --projectname.web。*)-コントローラー、ビューモデル、CSS、コンテンツ、スクリプトなどで構成されるプロジェクト。プロジェクトのDIを処理するIOC(Ninject)もあります。
このソリューションは、スタンドアロン製品として正常に機能します。私たちの問題は、クライアントごとに製品を拡張およびカスタマイズすることです。私たちのクライアントは通常、ブランド化されたCSSとスタイルを使用して、コア製品バージョンを非常に迅速に(通常は契約に署名してから数日以内に)提供することを望んでいます。ただし、クライアントの70%は、カスタマイズによって機能を変更することを望んでいます。ドメインモデル、ビューモデル、ビューなどの追加プロパティなど、一部のカスタマイズは小規模です。その他のカスタマイズはより重要であり、まったく新しいドメインモデルとコントローラーなどが必要です。
一部のカスタマイズはすべてのクライアントに役立つように思われるため、定期的にカスタマイズから変更してコアに追加したいと考えています。
現在、ソースコードをTFSに保存しています。プロジェクトを開始するには、通常、ソースを新しいチームプロジェクトに手動でコピーします。クライアント名を反映するように名前空間を変更し、基本部分のカスタマイズを開始してから、Azureにデプロイします。これは明らかに完全に重複したコードベースになり、それを実行する正しい方法ではないと確信しています。コア機能を提供し、必要に応じて拡張/オーバーライドするものが必要だと思います。しかし、私はこれについてどうやって行くのか本当にわかりません。
だから私はそれを可能にする最良のプロジェクト構成に関するアドバイスを探しています:
- コードの迅速な展開–ブランド化/マイナーな変更を可能にするために、新しいクライアントを簡単に開始できます
- コードのコピーと貼り付けの必要性を防ぎます
- 緩く結合した状態を維持するために、可能な限り多くのDIを使用する
- クライアントごとにコードのスポークを許可する
- コア製品を1か所で拡張し、コアの最新バージョンを入手して再デプロイした場合にすべてのクライアントにその機能を提供させる機能
どんな助け/アドバイスも大歓迎です。誰もが役立つと思う情報を追加してください。