ASP.NET MVCサイトをモジュール化する方法


14

ASP.NET MVC 4を使用して従業員イントラネットシステムを構築する計画段階にあります。このサイトは、メッセージング、給与の変更など、異なる機能を提供する個別の「モジュール」で構成されています。 。これらのモジュールをコンパイル時に有効または無効にできるようにしたいと思います。ホームページには、ロードされた各モジュールにリンクするナビゲーションが表示されます。

これまでは簡単ですが、ナビゲーション機能がモジュールについて事前に知る必要はありません。言い換えれば、モジュールを動的に検出できるようにします。新しいモジュールのコードを記述し、ソースの他の場所でコードを変更せずにナビゲーションバーにリンクを追加できるようにしたいのです。各モジュールには、ナビゲーションバーに自分自身を登録する何らかの方法が必要です。さらに重要なことですが、これは、ロードされた各モジュールに対して行う必要があります。

MVCのエリアはサイトのレイアウトが事前にわかっている場合のために設計されているため、MVCのエリアを使用することはできません。MEFは適切であると思われますが、MEFとMVCを組み合わせることに成功した人はいませんでした。MEFは実際にここに行く方法ですか、それとも私が必要なことを達成するためのより良い方法がありますか?


良い質問です。あなたのソリューションは、おそらくリフレクションを使用することを中心に展開されると感じています。アイテムを作成するときに引き続きエリアを使用できますが、メニューの作成方法では、リフレクションを使用してすべてのタイプを取得する必要があります(変更するコードを保存するため)。それらがすべて同じインターフェイスIModuleインターフェイスを実装している場合はどうでしょう。次に、インターフェイスのすべての継承を見つけて、リンクする必要のあるすべてのモジュールを取得できますが、問題は追加データなしでそれをリンクと正確にどのように関連付けるかです。うーん、プロットが厚くなる
...-mattytommo

1
CMS内からCMS管理を行う代わりに、ビルド時にCMSを実行したい場合を除き、CMSをビルドしたいように思えます。それが質問に私を導きます、なぜあなたはビルド時にそれをしたいのですか?
ジェームズP.ライト

@ JamesP.Wrightまあ、私がビルド時にそれをしたかったのは、サイトのページを通してこの機能を公開するよりも簡単だと思われたからです。(さらに、使用されるモジュールのセットはめったに変更されないため、この種の動的選択のオーバーヘッドは不要です。)しかし、ビルド時にモジュールを選択するよりも重要なのは、アプリケーションがモジュールを見つける能力ですそもそも、これは私の質問の推進力です。
-bdesham

nopCommerce(nopcommerce.com/documentation.aspx)は、あなたが望む良い例の一部です。プラグインの作成方法とDIに対するアプローチをご覧ください。
ルイ

研究目的のために、MEFとMVCを組み合わせる「混合成功」が何であるか興味がありました。codeplexは現在「アーカイブに生きている」ため、OPが提供したリンクはもう機能しません。他の人の時間を節約するには、archive.codeplex.com / ?p = mefのディスカッションタブで「Microsoft.Composition経由でMVC4を使用したMEF2」をctrl + fで検索します;)
ケビン

回答:


4

最初に、アプリがコンパイル済みモジュールを静的コンストラクターとシステム内のモジュールの静的メンバーリストに登録するために使用される集中型クラスを作成します。モジュールには、メニュー項目かどうか、およびメニューに表示される順序を示す静的プロパティがあります。

各モジュールには、モジュールを追跡する集中型クラスに記録される独自の静的コンストラクターがあります。

このシステムは、従業員が出勤して出勤するタイムクロックシステムのようなものです。その後、給与計算時に、誰が出勤したかなどに基づいてすべての従業員に支払います。

リフレクションは、メタプロパティ情報を継承する必要があるモジュールのインターフェイスコントラクトがある場合にも使用できます。

私はワーナーブラザーズミュージックで働いており、さまざまなエンコード形式で内部音楽処理システムを使用していました。クラスの基本的なメタプロパティを取得するためにリフレクションで型キャストできるように、継承を使用するリフレクションでエンコードするための汎用プラグインモデルを作成しました。ただし、静的な集中型クラスを使用しようとしませんでした。それをランダムに楽しみの別の方法として考えました。

また、要件のベースラインを持つ複数のクライアントにサービスを提供するMVCを使用したが、あなたがやろうとしているものに似た拡張機能も追加したことを付け加えます。代わりに、コンパイルを必要とせずにMVCをApp_Codeを使用するように変換しました。集中コンパイルを必要とせずに、この方法でファイルを簡単にプッシュできます。

ローカルでコンパイルしてDLLをプッシュするのではなく、単純なFTPまたはGITプッシュでJITを活用できます。

スタックオーバーフローに関する記事へのリンクを次に示します。


それは私が想像していたものに似ています。唯一の問題は、最初にモジュールをロードする方法です。どのようなメカニズムで、それぞれを中央クラスに登録するように指示しますか?これは、MEFが適切であると思われる場所です。
bdesham

MEFの方が優れています。私はそれを見ずにアイデアを出していましたが、それらのプロジェクトを行ったときに出ていたなら、そのオプションを考えればMEFを使用したでしょう。良いアイデアのようです。MEFとMVCを組み合わせられない理由はわかりません。
ジェイソンセブリング

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.