私は、現場全体に展開されるシステムの設計を始めています。退屈な、数十セントのデータベースサーバーバックエンドマルチクライアントシステムです。
私がこのシステムに実装することに非常に熱心な機能の1つは、開発チームがクライアントの再起動を必要として実行中の変更を行う機能です。 UIの変更についてはそれほど心配していません。再起動が必要になる場合がありますが、動作の機能が変更されます。
現在、C#とWPF UIを使用し、MVVMアーキテクチャを使用し、PRISMと依存性注入を最大限に活用して基本的なレイアウトを開始しました。
私は現在2つのアプローチを考えました:
MEFフレームワークを使用したプラグインベースのシステム。これまでのプロトタイピングでは、デフォルトの動作を定義し、ロードされているdllに応じて代替の動作を提供することができました。
LUAであれ、RoslynベースのC#スクリプトの試行であれ、ある種のスクリプトサポート。これについてはまだ徹底的に調査していませんが、機能するようですが、スクリプトに公開されているツールを慎重に検討した場合に限ります。
アプローチ1の長所:小規模なプロトタイプでは問題なく動作するようで、非常に簡単に制御できます。
アプローチ1の短所:私のテストでは、オブジェクトがMEFにロードされると、アプリケーションドメイン全体をアンロードする以外はアンロードできず、ドメイン間でオブジェクトを渡すことは...言うプロセスです少なくとも。
アプローチ2の長所:展開は非常に簡単で、CSIXは既存のツールで簡単に記述できます。 LUAはそれほど違いはありません。私の(非常に限定された)テストから、最新のスクリプトが実行されていることを確認するために、各実行の前にディスクからスクリプトを再ロードすることに問題はありません。スクリプトは、絶対的には1分に1回だけ実行する必要がありますが、1時間に1回実行する可能性が高いため、これによってパフォーマンスが大幅に低下することはありません。
アプローチ2の短所:これまでのところ、開発の量は最小限に抑えられています。利用可能なものの表面を明示的に宣言する必要があります。そうしないと、要件が変更されると、何らかの方法で再コンパイルおよび再リリースされます。私の知る限り、これまでで最も機能が制限されていました。
では、どのようなアプローチでシステムを最も簡単に変更できるでしょうか。
また、どちらのアプローチでも見逃した落とし穴はありますか?
まだ検討していないオプション3はありますか?
MEFは、プラグインアーキテクチャの実装など、大きな部分に適しています。これは、特定のユーザーだけが利用できるようにしたい機能がある場合に役立ちます。たとえば、グループが支払った機能を追加しました。または、HRには存在しないアカウンティング用のプラグイン。起動時にピースを動的にロードして接続するように設計されています。動的なアンロードとリロードを目的としたものではありません。
考慮する必要がある最大の問題は、展開メカニズムです。ユーザーにアプリを停止して再起動するように要求することを回避することはできません。これらの更新をどのように利用できるようにするかが問題です。いくつかのオプションがあります。
あなたの状況では、あなたはあなたの企業にとって何が実行可能であるかについて考えなければなりません。それには、企業を運営する人々との会話が必要になります。サイドカーアップデータアプリは、ユーザーがシステムにインストールする権限を持っている場合にのみ実際に機能します。 Software Centerはそうではありませんが、企業がそれを使用している場合にのみ実現可能です。
私はそれを言うのは嫌ですが、時には超ローテクソリューションがちょうど法案に合うことがあります。ランチャーは、スクリプトまたは小さなC#アプリケーションとしてビルドできます。それは機能し、洗練されておらず、処理する必要のある管理上の魔法がいくつかあります。それはあなたの「オプション2」ソリューションのように聞こえます。