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 コンテナーの変更を常にポーリングする代わりに、ライブラリの最新バージョンをダウンロードするスタートアップ タスクを単純に作成することもできます。