2009-03-07 5 views
0

は、MSDNの統一フレームワークのためのこのリンクはUnityを使ってWebアプリケーションのポストバック間の依存関係を永続化する方法は?

http://msdn.microsoft.com/en-us/library/dd203319.aspx#

私はわからない は「あなたはWebアプリケーションでポストバック間の依存関係をキャッシュまたは持続することができるようにしたい」と述べ何すべて上記のことを意味します。 Unityを使用してこれを行う方法の例を探しています。ユニティがポストバックを解決する方法が不明です。それは単にセッションの依存関係を維持し、それを元に戻しますか?

答えて

1

私は、Sessionを使用し、キャッシュを使用する簡単な例を書いています。インクリメンタと呼ばれるテストクラスを作成しました。このクラスは、クラスを静的にした場合、または少なくとも変数を作成した場合と非常によく似ています。シングルトンは

public class Incrementer 
{ 
    private int count; 

    private object synclock = new object(); 

    public int GetCount() 
    { 
     return count; 
    } 

    public void Increment() 
    { 
     System.Threading.Monitor.Enter(synclock); 
     count++; 
     System.Threading.Monitor.Exit(synclock); 
    } 
} 

public IUnityContainer SessionUnityContainer 
{ 
    get 
    { 
     if (Session["SharedIncrementer"] == null) 
     { 
      IUnityContainer container = new UnityContainer(); 
      container.RegisterInstance<Incrementer>(new Incrementer()); 
      Session["SharedIncrementer"] = container; 
     } 
     return Session["SharedIncrementer"] as IUnityContainer; 
    } 
} 

public IUnityContainer CacheUnityContainer 
{ 
    get 
    { 
     if (Cache["SharedIncrementer"] == null) 
     { 
      IUnityContainer container = new UnityContainer(); 
      container.RegisterInstance<Incrementer>(new Incrementer()); 
      Cache["SharedIncrementer"] = container; 
     } 
     return Cache["SharedIncrementer"] as IUnityContainer; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Incrementer i1 = SessionUnityContainer.Resolve<Incrementer>(); 
    Incrementer i2 = CacheUnityContainer.Resolve<Incrementer>(); 

    for (int i = 0; i < 10; i++) 
     i1.Increment(); 

    for (int i = 0; i < 5; i++) 
     i2.Increment(); 

    Response.Write(i1.GetCount().ToString()); 
    Response.Write(i2.GetCount().ToString()); 
} 

ホープtihsを解決するためRegisterInstanceがあることができます:

アンドリュー

EDIT:次の例cimply UnityContainerのシングルトンインスタンスを使用して、ページをリフレッシュし続けるならば、それが表示されます前の値を維持します。

public class Incrementer 
{ 
    private int count; 

    private object synclock = new object(); 

    public int GetCount() 
    { 
     return count; 
    } 

    public void Increment() 
    { 
     System.Threading.Monitor.Enter(synclock); 
     count++; 
     System.Threading.Monitor.Exit(synclock); 
    } 
} 

public static class ExampleSettings 
{ 
    private static IUnityContainer container = null; 

    public static IUnityContainer Container 
    { 
     get 
     { 
      if (container == null) 
      { 
       container = new UnityContainer(); 
       container.RegisterInstance<Incrementer>(new Incrementer()); 
      } 
      return container; 
     } 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Incrementer i1 = ExampleSettings.Container.Resolve<Incrementer>(); 

    for (int i = 0; i < 10; i++) 
     i1.Increment(); 

    Response.Write(i1.GetCount().ToString()); 
} 
+0

Andrewさんのおかげでありがとう。私の勘違いはmsdnのその声明にあります。ここでのポストバック間のPERSISTING依存関係の統一性はどうですか?私たちはセッションに何かを置くことができ、ポストバックを超えて持続します。私はUnityが私たちの依存関係を解決していることに同意します:) – dotnetcoder

+0

Msndは、Unityを使用する理由の1つは「Webアプリケーションのポストバック間で依存関係をキャッシュしたり維持したいと思っています」ということです。 – dotnetcoder

+0

テストしてください。デモ・リポジトリ・クラスを宣言し、ContainerというSingleton Propertyを宣言します。単一のコンテナのインスタンスを返します。キャッシュのセッションは必要ありません。独自の実装を使用します。 –

関連する問題