2012-11-29 17 views
5

2人の異なる顧客が使用するVisual Studio 2010のC#WinFormsアプリケーションがあります。アプリケーションの基本機能は各顧客で同じですが、特定のコード行(ストアドプロシージャ、リソース、特定の動作の名前)はバージョンによって異なります。これまでは、同じプロジェクトにアプリケーションを保存し、ビルド/パブリッシング時にプリプロセッサディレクティブを使用して、使用するデプロイメントを切り替えました。しかし、プロジェクトの範囲は、これがもはや実現可能ではない点にまで成長した。2つのバージョンのアプリケーションの同時更新と展開

コードの多くは共有されているので、私はソースコードファイルの複製を避けようとしています。異なるバージョンを同時に展開する必要があるアプリケーションを維持するのが最善のアプローチであると私は思っています。

+0

分岐を処理するためにプリプロセッサディレクティブを使用しないでください。 –

+0

合意。これは外部の顧客が関心を示した小さな社内アプリケーションとして開始されたため、分離のための迅速なソリューションが必要でした。 – WickerPopstar

答えて

4

インターフェイスを使用してクラスを定義します。インターフェイスを持つということは、同じインターフェイスの複数の実装をクライアントごとに1つずつ持つことができることを意味します。これにより、既存のコードベースを分析し、これらのインターフェイスを定義できるコード内の論理的な区切りを識別する必要があります。

これで、クライアントに基づいて必要に応じてインターフェイスを読み込むことができます。たとえば、設定でこれを行うことができます。設定値に基づいて、Implementation1またはImplementation2をロードします。この特定のビットを達成する多くの方法があります。あなたは、依存性注入、制御の逆転を読み、Ninject、Autofac、Unityのようなツールを見てください。

それは実際には最初のあなたはプリプロセッサディレクティブを使用しますが、アプリケーションが成長しているかのように見ているかを考慮に難しいかもしれない、あなたはこのリファクタリングが起こる必要があります。これをやっていないと、このリファクタリングは後でアプリケーションが複雑になるにつれてかなり高価になることに注意してください。

+0

私はそれがアーキテクチャ上の問題であり、用語集(依存性注入、IOCなど)に感謝しました。それは解決策を探すときに私が見逃していた言葉でした。 – WickerPopstar

2

異なる機能は、アプリケーションのアーキテクチャの一部である必要があります。異なる顧客に異なる機能が必要な場合は、抽象的に取り除いてください。ビヘイビアを包括するインターフェイスを作成し、2つの異なるアセンブリで2つの異なる方法で実装します。その後、(あなたの配備の仕方にもよりますが)、あなたのアプリをいずれかのDLLまたは他のもので出荷することができます。再コンパイルや参照の追加などを避けるために、Ninject、Castle Windsor、MEFなどのDependency Injectionフレームワークを使用することができます。コードが十分に異なる場合、それは「プラグインのような」アーキテクチャです。

テキスト、色、基本的な相違点について言えば、単純にハードコードではなくデータ駆動型であるべきです。あなたのアプリがインターネットに接続されている場合は、ユーザーがログインするときに適切な設定をダウンロードすることができます。そうでなければ、テキスト/色/動作を顧客に固有の設定ファイルに入れることができます。 configトランスフォームを使用すると、そのプロセスを簡素化できます。

+0

基本的な違いは、すでにデータ駆動型であり、感謝しています。主に機能性です。私はこれらのフレームワークには慣れていませんが、このアプリケーションではClickOnceのデプロイメントを使用しています。これらのフレームワークがどのように実装されているかが変わりますか? – WickerPopstar

+0

私は私のプロジェクトで全く同じ状況にあります。他のDIフレームワークも動作しますが、アプリケーションのインストール後にURLからDLLを動的にダウンロードします。そうしないと、すべての顧客は他のすべての顧客のロジックを自分のインストールで取得します。ディスクではなくURLからアセンブリをロードするだけで、それほど変わることはありません。とにかくディスクから何ができるか:) –

0

いくつかの種類のリソースファイル、構成ファイル、またはプロパティファイルを使用して、いくつかの相違点を分けることができます。これにより、特定の状況で使用するストアドプロシージャの名前など、ファイルに何らかの種類の値を格納することを意味します。その後、コードはファイルから名前を読み取り、それを実行します。デプロイメントごとにコードを再構築することなく、ファイル内の値を変更できます。

関連する問題