私は、ASP.NET MVC 4で構築される従業員イントラネットシステムの計画段階です。サイトを別々の「モジュール」で構成し、それぞれに異なる機能を提供します:メッセージング、給与の変更など。 。これらのモジュールをコンパイル時に有効または無効にできるようにしたい。ホームページには、ロードされた各モジュールにリンクするある種のナビゲーションが表示されます。
これまでのところ簡単ですが、ナビゲーション機能でモジュールについて事前に知っておく必要はありません。つまり、モジュールを動的に検出できるようにしたいのです。新しいモジュールのコードを記述し、ソースの他の場所でコードを変更せずにナビゲーションバーにリンクを追加できるようにしたいと考えています。各モジュールには、ナビゲーションバーにそれ自体を登録する何らかの方法が必要です。さらに重要なこととして、これは、ロードされるときに各モジュールに対して実行する必要があります。
MVCのエリアは、サイトのレイアウトが事前にわかっている場合のために設計されているため、これを使用することはできません。人々はMEFとMVCの組み合わせで 混合成功 を持っているようですが、MEFはそれが適切であるように思われます。 MEFは実際にここに行く方法ですか、それとも私が必要とするものを達成するためのより良い方法がありますか?
最初に、アプリがコンパイル済みモジュールを静的コンストラクターと静的メンバーに登録するための集中型クラスと、システム内にあるモジュールの静的メンバーリストを用意します。モジュールには、メニュー項目かどうか、およびメニューに表示する順序を示す静的プロパティがあります。
各モジュールには、モジュールを追跡する一元化されたクラスに自分自身を記録する独自の静的コンストラクタがあります。
このシステムを、従業員が出入りするタイムレコーダーシステムのように考えてください。給与計算時には、出勤者などに基づいてすべての従業員に支払うことになります。
リフレクションは、それらのメタプロパティ情報からそのモジュールに継承する必要があるモジュールのインターフェイスコントラクトがある場合にも使用できます。
私はワーナーブラザーズミュージックで働いていて、さまざまなエンコーディング形式用の内部音楽処理システムを作りました。クラスの基本的なメタプロパティを取得するためにリフレクションで型キャストできるように、継承を使用するリフレクションでエンコードするための汎用プラグインモデルを作成しました。ただし、静的な集中型クラスを使用したことはありません。楽しみのために試す別の方法として、それをランダムに考えただけです。
また、要件のベースラインで複数のクライアントにサービスを提供しているMVCを使用したが、実行しようとしているのと同様の拡張機能も使用していることも付け加えておきます。代わりに、MVCをコンパイルせずにApp_Codeを使用するように変換しました。一元的なコンパイルを必要とせずに、この方法でファイルを簡単にプッシュできます。
ローカルでコンパイルしてDLLをプッシュする必要はなく、単純なFTPまたはGITプッシュでJITを活用できます。
スタックオーバーフロー に関するその記事へのリンクはここにあります
MVCでMEFを使用する方法を確認することもできます。これにより、再コンパイルまたはデプロイせずに、必要に応じて追加-削除することができます。いつものように、スコットは良い出発点です: http://www.hanselman.com/blog/ExtendingNerdDinnerAddingMEFAndPluginsToASPNETMVC.aspx