私は、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());
}
Andrewさんのおかげでありがとう。私の勘違いはmsdnのその声明にあります。ここでのポストバック間のPERSISTING依存関係の統一性はどうですか?私たちはセッションに何かを置くことができ、ポストバックを超えて持続します。私はUnityが私たちの依存関係を解決していることに同意します:) – dotnetcoder
Msndは、Unityを使用する理由の1つは「Webアプリケーションのポストバック間で依存関係をキャッシュしたり維持したいと思っています」ということです。 – dotnetcoder
テストしてください。デモ・リポジトリ・クラスを宣言し、ContainerというSingleton Propertyを宣言します。単一のコンテナのインスタンスを返します。キャッシュのセッションは必要ありません。独自の実装を使用します。 –