3

同じサーバー上のいくつかの異なるアプリケーション (クライアント) によって使用される機能があります。サービスとしてモデル化でき、バックエンド データベースがあり、一度に使用される機能とデータベースのバージョンは 1 つだけです。

これまで、単純な DLL の再利用を採用しており、機能、その構成ファイル、および依存関係が使用されるすべての場所にデプロイされていました。いくつかの場所で変更を行う必要があるため、機能の新しいバージョンを作成する場合や、新しいクライアントがそれを使用する場合、この方法は苦痛です。

これを行うためのより良い方法があるかどうか疑問に思っており、2 つの代替案を考え出しました。

  1. DLL (および依存関係) を GAC に配置します。問題は、コンポーネントをどのように構成するかです。クライアントは構成に関心がないため、サーバー上のハードコードされたパスに構成ファイルを保存することに傾いています。

  2. 機能を内部 (REST ベースの) サービスとして公開します。ファイアウォールを使用して、アクセスを内部クライアントに制限できます。

私たちが見ているように、#1 の長所はパフォーマンスとおそらくセキュリティであるように見えますが、#2 はセットアップがより簡単であると見ることができます.

ここで何か重要なことを見逃していませんか? 誰かが以前に同様の状況にあり、洞察を共有したいですか?

4

4 に答える 4

1

Josh がすでに述べたように、残念ながら、この種の質問に対する答えは、多くの場合「場合による」です。

私は GAC の大ファンですが、(ほぼ) 完全に機能し、頻繁に更新する必要がないことが確実なコードのみを GAC に配置する必要があります。コードが「開発中」である限り、それを使用するすべてのアプリケーションと一緒に公開してください。

于 2008-12-01T16:49:32.653 に答える
1

これは私が何度も苦労してきた問題であり、それ以外に最善の答えはありません。私の個人的な意見では、いくつかの理由から、オプション 1 を避ける必要があります。

  1. すべてのクライアントが単一のバイナリを共有することで、変更を加えるたびにすべてのクライアントをテストする必要があります。コンポーネントの背後にあるデータベースを変更していると想定できるため、あなたの正確なケースでは、とにかくこれを行う必要があるかもしれません。
  2. 何もハードコーディングしないでください。machine.config ファイルの AppSettings セクションに構成パスを保存できます。

オプション 2 については、WCF を使用することも 1 つの選択肢です (環境でサポートできると仮定します)。WCF を使用すると、バイナリ シリアライゼーションを使用して TCP トランスポートを使用できます (共有メモリ トランスポートがある場合もあります)。これらは両方とも、パフォーマンスのギャップを縮めるのに役立ちます (ただし、オプション 1 は常にサービス ベースのアプローチよりも優れています)。

オプション 2 を使用すると、契約が破られていないことを検証する自動テストを開発できるため、すべてのクライアントを再テストする必要性も軽減されます。これにより、単一の場所に公開し、迅速な自動テストを実行し、クライアントを壊していないことを知ることができます.

そうは言っても、オプション 1 と適切な単体テストのセットを使用して同じことを達成できますが、私の経験に基づくと、長期的にはオプション 2 の方が簡単です。

オプション 2 では、将来さらに CPU パワーが必要になった場合にサービスをスケールアウトすることもできます。

個人的には、ファイアウォールの構成、認証の処理、サービスのセットアップなどに対処する必要がないため、オプション 1 の方がセットアップが簡単だと思います...デバッグも簡単になります (アプリケーションを配布すると、新しいタイプの障害が発生します)たとえば、サービスをホストしているサイトがクラッシュし、クライアントに障害が発生し始めます)。

最後の提案は、プロキシ/ファサード パターンを使用して、サービスの実際の場所からクライアントを隔離することです。これにより、クライアント コードを変更することなく、時間の経過とともに拡張できます。

于 2008-12-01T16:36:54.253 に答える
0

Josh は、オプションとして WCF を指摘しています。

この問題は、まさに SOA が解決するはずのものです。

于 2008-12-01T16:48:03.200 に答える
0

特に、REST の可用性を制限するために余分な時間を費やさなければならないだけなので、オプション 1 を使用する方が簡単で簡単だと思います。(しゃれが意図されています!)

于 2008-12-01T16:38:41.613 に答える