1

「フレームワーク」として機能し、Web サーバーで実行されているいくつかのサービスに関する情報を表示する ASP.NET Web サイトを構築しています。サイトが行う必要があることの 1 つは、サービスによって読み込まれたいくつかのモジュールのカスタム構成ページを提供することです。モジュールはすべて共通の API を実装するので、そこに懸念はありません。私の懸念は、共通のフロント エンドによって提供される、各モジュールに固有の構成ページをどのように取得できるかということです。

ページは、ユーザー入力の検証、ボタン クリックの処理などを行う必要があります。そのため、各モジュールにメソッドを用意するほど単純ではありません。

public string getHTMLConfigPage()

これは、モジュールの構成ページがユーザー入力を必要としない場合にのみ機能します。この場合、すべてのモジュールになんらかの構成が必要です。少なくとも、「オン/オフを切り替える」ことを示すチェックボックスが必要です。

理想的な使用例は次のとおりです。

  1. 実行時に IIS プロセスがバックエンド サービスと通信し、N 個のモジュールが実行されていることを認識します。
  2. サーバーは、これらの N # 個のモジュールへのリンクをドロップダウン メニューに追加します。
  3. ユーザーがモジュールのメニュー項目をクリックすると、モジュールの構成ページが表示されます
  4. ユーザーはモジュールを好きなように構成し、個々のモジュールがそのシーケンス全体を制御します

これは、C# の winforms で既に正常に実装されています。そこで行った方法は、各モジュールにメソッドを実装させることでしたpublic void showConfigDialog(IWin32Window parent);。これは、通常のデスクトップ アプリではうまく機能しますが、明らかに、Web サーバーで何かを行うのには役に立ちません。

私がこれまでに考えた唯一のことは、各モジュールにも IIS Web サーバーにいくつかのものをインストールさせiFrame、メインの「フレームワーク」ページがモジュールのページをフレーム (またはポップアップ ウィンドウ) に表示できるようにすることです。 )、しかし、モジュール開発者がIISスペースに何かを入れるためにある種のセットアップスクリプトを含める必要があるという点で、それは面倒に思えます...

それで、これを行うためのより良い方法はありますか、それとも iFrame メソッドが唯一の方法ですか?

システムの詳細:

  • ASP.NET 4.0
  • C#.NET 4.0
  • IIS 7.5 (サーバー 2008 R2)

編集:追加の詳細

また、ASP.NET が実行時にプローブする特別な ASP.NET DLL をモジュールにディレクトリに配置することも考えました。しかし、問題の根源は残っています。モジュールによって提供される DLL を、メインの Web ページ セットに統合するにはどうすればよいでしょうか。Web ページのメイン セットには、Site.Masterいくつかの必要な項目 (CSS、メニュー バー、いくつかの jQuery アドオンなど) を提供するページがあります。モジュールからの DLL は、この情報に加えて、メインの Web ページが、作成した下層の Windows サービスと対話するために使用する名前付きパイプを必要とする可能性があります。

4

4 に答える 4

3

ASP.NET 用のプラグイン フレームワークが必要なようです。これは、複雑なページと構成をプラグインに入れ、実行時にロードできるようにする MEF (Managed Extensibility Framework) を使用することで実現できます。またはそう私は信じています。

ここでCode Project の記事をチェックすることから始めてください。MSDN の例がここにあるかもしれません。

于 2012-12-26T10:13:41.613 に答える
1

説明した内容のほとんどは、OrchardCMSに実装されています。http://orchardproject.net。この動的なモジュールの読み込みを実現する方法の例として、それらのコードを検討するか、可能であれば、アプリのフレームワークとしてOrchardに切り替えることを検討してください。これはCMSとして知られていますが、実際には、その上に.NETアプリを構築するための優れたフレームワークです。

彼らは依存性の注入にAutofacを使用し、モジュールはインターフェースを実装することで独自のルート、コンテンツ、ページなどを注入できます。Orchardのコアフレームワークは、これらのモジュールをスキャンして特定のインターフェイスを実装するクラスを探し、それらのインターフェイスのメソッドを呼び出して、モジュールから特定のコンテンツをプルします。モジュールは、コマンドラインまたはWebインターフェイスから有効/無効にできます。

たとえば、モジュールを作成すると、そこに、INavigationProviderOrchardが管理ダッシュボードのメニュー項目を取得するために使用するメソッドを持つというインターフェイスを実装するクラスがあります。次に、別のクラスにインターフェースを実装できIRouteProviderます。これにより、アプリのすべてのルート(フロントエンドと管理ダッシュボードの両方)についてOrchardに通知されます。ビュー/コントローラー/ルートにMVC規則を使用することもできます。RazorとWebFormsの両方のビューエンジンがサポートされています。

于 2012-12-28T16:55:23.583 に答える
0

さまざまなシナリオが明確に定義されている場合は、他のクラスのページからのデータ、または別の埋め込みプロジェクトやライブラリからのデータを処理することは問題ではないと思います。たとえば、DropDownListにデータを入力するには、次の操作を実行できます。

Partial Class Default
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      If Not Page.IsPostBack Then
          Dim itemList As List(Of ListItem) = ClassForTheMagic.GetItemsForComboBox(txtBox1.Text, checkBox2.check, ...)
          For Each item As ListItem In itemList
              DropDownList1.Items.Add(item)
          Next
      End If
  End Sub

エンドクラス

次に、他のファイルに含めることができます。

Public Class ClassForTheMagic

  Public Shared Function GetItemsForComboBox(ByVal txtBox1 As String, ByVal checkBox2 As Boolean, ...) As List(of ListItem)
      Dim itemList As New List(Of ListItem)
      itemList.Add(New ListItem(txtBox1, "..."))
      itemList.Add(New ListItem(checkBox2, "..."))
      ...
      Return itemList
  End Function

End Class

ps:vbコードでごめんなさい

于 2012-12-06T23:22:59.957 に答える
0

私は提案します:

  • 相互構造アクセスを備えたベースラインプラグイン構造モデル。プラグインホストは、個々のプラグインをインスタンス化/初期化し、それ自体(またはモデルクラスの選択)を参照として渡すことができます。
  • ロードされたプラグインを反復処理し、コンテキストページをプッシュして、パイプラインモデルのプラグインで処理できるようにするためのHTTPモジュール。そうすれば、特定の瞬間に発生する特定のイベントを選択することもできます。たとえば、ユーザーがメールを入力した後にGravatarアイコン/ OpenID認証の検索を起動し、収集したデータをプラグインホストが提供するモデルクラスに投稿します。 。
于 2012-12-27T21:10:17.423 に答える