Orchardダイナミックコンパイルメカニズム

6180 ワード

Orchardは拡張可能なCMSシステムとして、実行時にいくつかのモジュールまたはトピック(拡張と総称)をロードする必要があります.Orchard 0.5版から、これらの拡張機能のインストールとアップグレードをより簡単にすることに力を入れています.Orchardと他のいずれかのASP.NET MVCアプリケーションも、Visual Studio環境でコンパイルできます.しかし、Orchardはまた、モジュールのdllをWebサイトのbinディレクトリの下に配置する必要がないなど、別のモジュールロードポリシーを提供しています.さらに、Orchardは、モジュールソースコードに基づいてモジュールを動的にコンパイルすることもできる.これにより、dllファイルを比較的柔軟に配置でき、Visual Studio環境なしで変更したモジュールソースコードを随時コンパイルできるようになります.これはASPに似ています.NETの「App_Code」フォルダは、Orchardがこのようなフォルダをより多くサポートしているだけです.この文書では、Orchardがモジュールをロードし、動的にコンパイルする方法について技術的に説明します.
 

概要


Orchardアプリケーションが起動すると、Orchardフレームワーク(具体的にはExtensionLoaderCoordinatorクラスが担当する)は、それらのモジュールがインストールされていることを理解し、アクティブ化する必要があります(これらのモジュールをロードするdllです).さらに細かく言えば、このプロセスは3つの段階に分けられます.
1、発見:現在のサイトにどのようなモジュールがあるかを明らかにする.
2、アクティブ化:どのようなポリシーで各モジュールをアクティブ化またはロードするかを明らかにします.
3、引用解析:これらのモジュールをアクティブにするには、それらのプログラムセットを参照する必要があることを明らかにします.このフェーズテクノロジーは「アクティブ化」フェーズの一部ですが、参照解析に関する問題を個別のセクションとして考えやすくなります.
モジュールがアクティブ化されると、さらにチェックして個別の機能を有効にしますが、これは本明細書で議論する必要があるテーマではありません.
 

検出


Orchardで使用可能なモジュールのリストは、いくつかのフォルダの下にある「module.txt」ファイルをクエリーすることによって得られます.これらのデフォルトクエリーのフォルダは、次のようにそれぞれ列挙されます.
 
「~/Modules」フォルダ
「~/Modules」フォルダには、ほとんどのOrchardモジュールが含まれています.Orchardは、各モジュールがというサブフォルダに格納され、「module.txt」ファイルが含まれることを約束します.パッケージ、パブリッシュ、および分析モジュールは、今回のフォルダの下にあるモジュールのみです.このフォルダは、ユーザーが拡張Orchardモジュールをカスタマイズしたフォルダです.
 
"~/Core"フォルダ
「~/Core」フォルダには、Orchardチームが提供するOrchardの最もコアなモジュールが含まれています.ユーザーは通常、ここに新しいモジュールを追加しません.
 
「~/Themes」フォルダ
「~/Themes」フォルダにはOrchardトピックが含まれています.動的コンパイルとして,トピックはほとんどモジュールのように処理され,処理トピックにはコード(binおよび.csprojファイル)がない.この文書の残りの部分では、「モジュール」に言及すると、「トピック」にも適用されます.
 
注:「~/」はサイトのルートディレクトリを表します.
 


次の例は、6つの拡張機能を含むOrchardインストールの例です.2つのコアモジュール「Common」と「Localization」、2つのアプリケーションモジュール「Foo」と「Bar」、2つのトピック「T 1」と「T 2」です.
RootFolder

  Core

    Common

      module.txt  <= "Common" module from "Core"

    Localization

      module.txt  <= "Localization" module from "Core"

  Modules

    Foo

      module.txt  <= "Foo" module

    Bar

      module.txt  <= "Bar" module

  Themes

    T2

      theme.txt  <= "T1" theme

    T2

      theme.txt  <= "T2" theme

 
アクティブ化
Orchardが検出フェーズからすべての「module.txt」ファイルを収集すると、Orchardは異なるポリシー(または「モジュールマウント」)を使用してメモリにモジュールをロードします.内部では、モジュールをロードする動作がアクティブです.「module.txt」ファイルとして入力し、「System.Type」リストを返します.これは、Orchardが1つのプログラムセットに複数のモジュールを含むことをサポートしているため、「Orchard.Core.dll」には約10のOrchardモジュールが含まれているため、「System.Assembly」リストを返すのとは異なります.Orchardでは、次のモジュール・ロード・ポリシー(マウント)が実装されています.
リファレンスモジュールマウント
このマウントは「~/bin」ディレクトリで「module.txt」ファイルのモジュール名に対応するプログラムセットを検索し、このプログラムセットが存在する場合、変更セットのすべてのタイプをロードして返します.このローダは、すべてのモジュールが予めコンパイルされ、dllが「~/bin」ディレクトリに格納されている場合に使用され、典型的な「asp.net mvc」アプリケーション方式である.
コアモジュールマウント
「module.txt」ファイルが「~/Core」フォルダから来る場合、コアモジュールマウントはOrchardから戻る.Core.dllの「Orchard.Core.」ネーミングスペースのすべてのタイプ.Orchard.Core.dllは、Orchardコアモジュールを含む特殊なプログラムセットであり、Orchardフレームワークに基づいて基本的な機能を提供します.
プリコンパイルモジュールマウント
「module.txt」ファイルが「~/Modules」フォルダから来ている場合、プリコンパイルモジュールマウントは「~/Modules//bin」で「moduleMame」というプログラムセットを検索します.このファイルが存在する場合は「~/APp_Data/Dependencies」フォルダの下にコピーされます.これはASP用の特殊なフォルダです.Net「~/bin」フォルダ以外のプログラムセットの場所を検索します.
ダイナミックモジュールマウント
「module.txt」ファイルが「~/Modules」フォルダから来る場合、ダイナミックモジュールマウントは「~/Modules//bin」で検索されます.csprojファイル.このファイルが存在する場合、このマウントはOrchardコンパイルマネージャを使用します.csprojファイルは、プログラムセットをコンパイルし、変更セットのすべてのタイプを返します.
注意:このマウントはシステムが実行されるときに1つしかありません.よく「ダイナミックコンパイル」と呼ばれます.実際には、すべてのモジュールがプリコンパイルされている場合、他のマウントを選択することもできます.

マウントの選択


指定されたモジュールをロードできるマウントマシンが1つ以上ある可能性がある以上、Orchardはどのようにして正しいモジュールを選択しますか?各マウントは、対応するモジュールの「最終変更時間」を返します.複数のマウントが存在する場合、Orhcardは最新の「最終変更時間」に基づいて、どのマウントを使用するかを決定します.例えば、1つのモジュールには、すべてのソースファイルが含む.csporjファイルとbinディレクトリにコンパイルされたdll.初めてモジュールをロードするとき、Orchardはbinディレクトリにプログラムセットをロードします.ソースコードがプログラムセットより新しい場合は少ないはずです.しかし、ソースコードが変更された場合、ダイナミックモジュールマウントが返す「最終変更時間」がbinディレクトリにプログラムセットをロードする「最終変更時間」よりも大きい場合、Orchardはダイナミックモジュールマウントを採用します.この相違は「~/Modules」フォルダの下のモジュールにのみ存在することに注意してください.「~/Core」フォルダの下のモジュールはコアモジュールマウントのみを採用するためです.

RootFolder

  Bin

    Orchard.Web.dll

    Orchard.Core.dll

    Foo.dll

  Core           

    Common        <= "Core Module" loader

      module.txt

    Localization  <= "Core Module" loader

      module.txt

  Modules

    Foo           <= "Reference Module" loader (because a "~/bin/Foo.dll" file exists)

      module.txt

    Bar           <= "Precompiled Module" loader (because a "~/Modules/Bar/bin/Bar.dll" file exists)

      bin

        Bar.dll

      module.txt

    Baz           <= "Dynamic Module" loader (because a "~/Modules/Baz/Baz.csproj" file exists)

      Controller

         BazControler.cs

      Baz.csproj

      module.txt

リファレンス解析


ダイナミックモジュールローダは、csprojファイルのReferencesノードの内容は、モジュールのBinディレクトリでモジュールが参照する他のプログラムセットファイルを検索し、~/App_Data/Dependenciesフォルダの下にコピーします.注意モジュールが参照する他のdllは、モジュールBinディレクトリの下にコピーされ、参照先もこのディレクトリにコピーされます.

変更検出の構成


前述したように、アプリケーションの起動時にモジュールをロードします.ただし、アプリケーションが起動すると、モジュールのソースコードが手動で更新されたり、モジュールがWebサイトにインストールまたは削除されたりするなど、変更は随時発生する可能性があります.これらの変化を検出するには、Orchardが潜在的な変化を「監視」するメカニズムを提供し、変化が発生した場合にモジュールローダに通知する必要があります.変更が検出されると、現在のモジュールの構成は破棄され、アプリケーションが再起動するようにモジュールを再審査、ロード、およびアクティブ化します.場合によっては、これらの変化にはASPが必要である.NetのAppDomainが再起動(例えば、新しいバージョンのモジュールのプログラムセットがロードされる必要がある)、Orchardはこのような状況を検出し、ASP.NetAppDomain再起動.

「~/APP_Data/Dependencies/Dependencies.xml」ファイル


このファイルには、最後にアプリケーションのロードに成功したときのモジュール、マウント、およびモジュールが参照したプログラムセットのリストが含まれています.このファイルの内容を表示して、デバッグに使用して、対応するdllがロードされているかどうかを検出できます. 
 

リファレンスドキュメント


http://www.orchardproject.net/docs/Orchard-module-loader-and-dynamic-compilation.ashx