マイクロソフト企業ライブラリ5.0学習ノート(九)ASP.NET WEBアプリケーション


ASP.NET Webフォームアプリケーションでは、Application辞書オブジェクトによって提供されるグローバル状態にコンテナを保存することが推奨されます.必要に応じてコンテナにアクセスしたり、HTTPモジュールを使用してページ上のコントロールの注入を自動的に完了したりすることができます.
通常、アプリケーション辞書オブジェクトを使用してコンテナの単一のインスタンスを格納する必要があります.プライマリコンテナのサブコンテナを作成し、各ユーザーのSessionオブジェクト、さらには各リクエストに格納して、カスタムタイプとマッピングを登録することもできます.しかし、これはアプリケーションのパフォーマンスを低下させる可能性があります.通常、追加のコンテナの作成をできるだけ避ける必要があります.
ASP.NETアプリケーションのコンテナインスタンス化の技術方法と制限:
1基本的な方法.小項目に適合
2注入に依存する推奨方法.実行時にページコントロールの注入を自動的に完了できます.
3.制限および代替経路.きほんほうしき
Global.asaxファイルからのApplication_Startイベントを使用してコンテナを作成して構築します.protected void Application_Start(object sender, EventArgs e) { Application.Lock(); try { var myContainer = Application["EntLibContainer"] as IUnityContainer; if (myContainer == null) { myContainer = new UnityContainer(); myContainer.AddExtension(new EnterpriseLibraryCoreExtension());//Add your own custom registrations and mappings here as required Application["EntLibContainer"] = myContainer; } } finally { Application.UnLock(); } }   
 
依存注入の推奨方法
上記の方法では、コンテナにアクセスする方法が提供されていますが、いくつかの制限があります.これは、必要なクラスのインスタンスを処理するためにコードを記述する必要があり、コードの発見性を低減する必要があることを意味します.Unityコンテナを使用する場合は、コンテナの各リクエストにBuildUpメソッドを使用して依存関係を構築するのがより良い方法です.これは、スペースとクラスの適切なプロパティの適用に関心を持つか、コンテナに注入登録とマッピングを構成する必要があることを意味します.実行時に必要なエンタープライズ・ライブラリ・オブジェクトと独自のクラスを注入します.
   1つの方法は、HTTPモジュールを作成することです.1つのページがロードされると、すべての依存に自動的に注入が作成されます.これを行うには、HTTPモジュールがページ初期化の実行中にコードを実行して依存を満たす必要があります.また、Global.asaxのApplication_Startメソッドを使用してコンテナを作成および充填することもできます.HttpApplicationStateクラスの拡張メソッドは、これらを作成すると、アプリケーションのコントロールとクラスが注入に自動的に依存するように構成の行を適用するだけです.
  自動依存注入のためのASP.NETアプリケーションの準備
1.プロジェクト内に新しいASP.NET HTTPモジュールクラス(たとえば、UnityHttpModuleと命名)を作成し、PreRequestHandlerExecuteイベントをキャプチャし、現在のページ要求の完全な制御ツリーを巡回するコードを実行し、Unity BuildUpメソッドを各コントロールに適用します.
2.アプリケーションのWeb.configファイルを編集して新しいHTTPモジュールを追加し、他のHTTPモジュールに配置する前に、それを最初に実行します.次に、前のステップのHTTPモジュール...other HTTP Modules defined here
 
 
 

3.创建一个类实现HttpApplicationState(提供一个访问容器的方法)的扩展方法,这个方法应该创建Unity容器并将它存储到Application字典中,如果存在则返回它的实例。

4.Global.asax )       ,  Global.asax.cs   Application_Start      。                 ,
 IMyService, CustomerService, DataService
protected void Application_Start(object sender, EventArgs e) { IUnityContainer myContainer = Application.GetContainer(); myContainer.AddExtension(new EnterpriseLibraryCoreExtension()); myContainer.RegisterType<IMyService, CustomerService>(); myContainer.RegisterType<IMyService, DataService>("CustomerData", new ContainerControlledLifetimeManager()); myContainer.RegisterInstance("myArray", new string[] {"Item 1", "Item 2" }); } 
       

   上記の推奨技術では、ページに注入されたコントロールやクラスを自動的に構築することはできません.ASP.NETでは制御やクラスのインスタンスが作成されているため、コンテナのBuildUpメソッドを使用します.これは、自動構築注入が発生しないことを意味します.逆に、プロパティ(setter)を使用することができます.入力、またはタイプのコントロールとクラスを作成する方法を定義し、パラメータを定義して解決し、プロパティまたはコンテナを使用して登録するInjectionMethodとして定義します.これにより、遅延構造が構築されます.コンテナ全体でUnityはパラメータのタイプを決定し、メソッドを呼び出します.もちろん、コードにオブジェクトを処理するインスタンスも格納できます.