1

いくつかのアプリケーションにコンパイルされている C# クラス ライブラリがあり、そのすべてが Azure 上の ASP.NET 4.0 WebForm および/または MVC クラウド サービスとしてホストされています。このライブラリを一元化して、パッケージの更新で更新サイクルごとに各プロジェクトをコンパイルおよび展開する必要がないようにしたいと考えています。

明らかに、WCF サービスを作成するオプションがありますが、その場合、サービスのコンシューマーになるためにクラス ライブラリとそれを使用する各プロジェクトの両方をリファクタリングする必要があり、システムの複雑さのために、これには数か月かかる場合があります。短期的な選択肢ではありません。

すべてのプロジェクトが Azure 上の同じアフィニティ グループにあるため、この DLL とそのメソッドをすべてのプロジェクトで共有する方法を一元化する代わりの方法はありますか? 私はオンラインで何も見つけられなかったので、コミュニティからいくつかの良いオプションと思考のスターターを得ることを望んでいます. 詳細を省略した場合はお知らせください。

4

3 に答える 3

4

David は、ライブラリの展開をどのように管理すべきかを説明してくれました。しかし、それ以外にも、このかなり動的なシナリオをサポートするには、アーキテクチャを変更する必要があります。

まず、実装を操作する代わりに、アプリケーションはインターフェイスを操作する必要があります。ライブラリで税金を計算でき、この税金計算機の実装が数週間ごとに変更されると仮定します。このために毎回アプリケーションを変更したくはありません。明らかに、WCF サービスは選択肢ではありません。

これで、次のように実装できます。

  • クラス ライブラリ: ITaxCalculatorインターフェイスを含む TaxCalculator.Contracts。
  • クラス ライブラリ: ITaxCalculatorインターフェイスを実装する ABCTaxCalculator クラスを含む TaxCalculator.ImplementationABC。
  • クラス ライブラリ: ITaxCalculatorインターフェイスを実装する DEFTaxCalculator クラスを含む TaxCalculator.ImplementationDEF (数週間後)。
  • 等...

ASP.NET MVC Web サイトは、ITaxCalculator インターフェイスでのみ機能します。MEFを使用すると、ITaxCalculator インターフェイスを実装するクラスを含むアセンブリのフォルダー (LocalResource) をスキャンできます。その結果、税金計算ライブラリから Web アプリケーションを切り離しました。

David が既に説明したように、ライブラリの最新バージョンを BLOB ストレージに保存し、それをローカル (LocalResource 内) にダウンロードしてから、MEF を使用してアセンブリを読み込むことができます。このようにして、元のアプリケーションは変更されず、ライブラリに必要な変更を加えることができます。

新しいバージョンがリリースされたことを各インスタンスに通知するには、いくつかのオプションがあります。コンテナー内の変更をチェックするタイマーを実行したり、Service Bus トピックを使用したり (各インスタンスがトピックにサブスクライブする) したりできます... しかし、David が既に説明したように、自分で申請。

もう 1 つの方法は、アプリケーションを再デプロイすることです。タイマーで BLOB コンテナーの変更を常にポーリングする代わりに、ライブラリの最新バージョンをダウンロードするスタートアップ タスクを単純に作成することもできます。

于 2012-09-01T20:47:07.963 に答える
3

同じデータセンターのblobストレージに共有DLLを保存するのはどうですか?ロールの起動時に、各インスタンスは最新のDLLをローカルストレージ(アプリのルートまたは必要な他のフォルダー)にダウンロードします。

同じデータセンター内では、BLOBストレージとロールインスタンス間の帯域幅は無料で、100Mbps xコア数であるため、非常に高速です。また、DLLを更新するには、DLLを1つの場所(blobコンテナー)にアップロードするだけで済みます。

DLLの1つを更新するときは、ロールインスタンスにリサイクル(最も安全な方法)するか、最新のDLLで更新するように通知する必要があります。ファイルウォッチャーのように「ブロブウォッチャー」を使用することはできません(したがって、シグナルを送信することをお勧めします)。または、ある種のバックグラウンドスレッドで「dll」コンテナを数分ごとにチェックし、変更されたコンテナを見つけたら、ローカルで更新をトリガーすることもできます。

注意点:DLLを更新し、各ロールインスタンスが変更をポーリングしている(またはリサイクルするように通知されている)場合は、すべてのインスタンスを同時にリサイクルしないように注意してください。そうしないと、一時的に利用できないサービスが残ります。

于 2012-09-01T20:08:29.573 に答える
0

私も同じような問題を抱えていました。私のシナリオは、いくつかの条件に応じて実行時にロードされたいくつかのプラグインを保持することでした。これらのプラグインは、メイン アプリケーションを妨害することなく更新できる必要があります。

私がしたことは、dll を SQL テーブルに格納し、必要に応じて取得し、リフレクションを使用して実行時にロードすることでした。これはメモリ内で行われたため、dll をアプリのルートやどこかに保存する必要はありませんでした。Azure でローカル パスを参照するのは適切ではないと思います。

于 2012-09-02T03:42:47.987 に答える