1

コンポーネントベースのアーキテクチャの使用に関連するSpringの構成の問題と、Springが構成ファイルをロードする方法に取り組んでいます。

問題は、各コンポーネントがスプリング コンテキストに情報を追加することですが、アセンブリから新しい構成を読み込むには、web.config を編集し、そのコンポーネントの構成リソースを追加する (または少なくとも編集する) 必要があります。既存のリソース ファイルをインポートし、アセンブリからコンポーネントの構成をインポートします)。web.config は別のグループによって「所有」されており、編集できません。

私が欲しいのは次のとおりです。

(1) Spring ファイル用に App_Config に特定のディレクトリを作成する

(2) そのディレクトリに filewatcher を追加して、XML ファイルがフォルダーに追加/フォルダーから削除された場合にアプリケーションをリロードします (Sitecore は既にこれを行っています)。

(3) コンポーネント (xyz と呼びます) をデプロイする場合、xyz.spring.xml ファイルをフォルダーにデプロイします。これには、次のようなアセンブリ内の適切な構成の単一のインポート ステートメントが含まれます。 assembly://PageTypes.Service/PageTypes.Service/PageTypes.xml"/> または、テスト/デバッグ構成 <import resource="assembly://PageTypes.Service/PageTypes.Service/PageTypes.DEBUG. xml"/>

(4) フォルダー内のすべてのファイルをロードし、それらを構成リソースとして処理する、Spring に伝えるコードを追加します (WebApplicationContext の特殊な実装を推測しています)。現在ある場所

<resource uri="~/App_Config/xyz.xml" />

次のようなものが欲しい

<resourceFolder path="~/App_Config/Spring" />

誰でもこれを行う方法を知っていますか、または同様のものが既に存在する場合は表示できますか?

... 私は、私が望むものを得る他の提案にもオープンです ...

4

1 に答える 1

0

わかりましたので、私はこれに対する答えを持っていると思います....

この「プラグイン」スタイルのアーキテクチャを使用しているため、特定のフォルダーからすべての構成ファイルをロードするためにスプリングが必要でした (アプリケーションコンテキストをリロードするために変更を監視しています)。filewatcher 要素は、私が使用している CMS で既に利用可能でした (Sitecore に感謝します)。

そこで、カスタム プロトコルを使用して Spring リソースをロードできるようにする IResource の実装を作成しました。

ステップ 1 - web.config の変更

まず、resourceHandler セクションを作成します。

<sectionGroup name="spring">
   <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/>
   <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
   <section name="resourceHandlers" type="Spring.Context.Support.ResourceHandlersSectionHandler, Spring.Core"/>
</sectionGroup>

次に、カスタム リソース ハンドラーのコードを追加します。

<spring>
   <resourceHandlers>
      <handler protocol="dir" type="TI.Base.Spring.DirResourceHandler, TI.Base"/>
   </resourceHandlers>
<context>
   <resource uri="dir://~/App_Config/Spring" />
</context>
</spring>

次に、Spring が提供する StringResource を非常に厳密にモデル化した DirResourceHandler を作成しました。これの核心は初期化にあります。

/// <summary>
/// Load all of the resource files in the directory, and create a virtual file importing all of those files
/// </summary>
/// <param name="resourceName"></param>
private void Initialize(string resourceName)
{
    string resourceNameWithoutProtocol = GetResourceNameWithoutProtocol(resourceName).TrimEnd(new [] {'/'});

    Path = HttpContext.Current.Server.MapPath(resourceNameWithoutProtocol);
    DirectoryInfo = new DirectoryInfo(Path);

    IEnumerable<FileInfo> files = DirectoryInfo.EnumerateFiles("*.xml");
    StringBuilder sb = new StringBuilder();

    sb.Append("<objects>");

    foreach (FileInfo xmlFile in files)
    {
        sb.Append(string.Format("<import resource=\"file://{0}/{1}\"/>", resourceNameWithoutProtocol, xmlFile.Name));
    }
    sb.Append("</objects>");

    Contents = sb.ToString();
}

Spring の達人でこのソリューションを評価して、それが実行可能かどうか教えてもらえますか?

于 2013-02-02T14:00:52.293 に答える