5

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

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

4

3 に答える 3

4

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

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

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

于 2012-11-29T19:01:53.080 に答える
2

さまざまな機能は、アプリケーションのアーキテクチャの一部である必要があります。顧客ごとに異なる機能が必要な場合は、それを抽象化します。動作をまとめるインターフェイスを作成し、2つの異なるアセンブリで2つの異なる方法で実装します。次に(デプロイメカニズムに応じて)、いずれかのDLLを使用してアプリを出荷できます。再コンパイルや参照の追加などを回避するために、Ninject、Castle Windsor、MEFなどの依存性注入フレームワークを使用できます。コードが十分に異なる場合、これは「プラグインのような」アーキテクチャです。

テキスト、色、基本的な違いについて話している場合、それらは単にハードコーディングするのではなく、データ駆動型にする必要があります。アプリがインターネットに接続されている場合は、ユーザーがログインしたときに適切な設定をダウンロードできます。それ以外の場合は、テキスト/色/動作を示すものを顧客固有の構成ファイルに入れることができます。構成変換を使用して、そのプロセスを単純化できます。

于 2012-11-29T19:02:04.930 に答える
0

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

于 2012-11-29T19:03:50.720 に答える