如何使用Unity在Web应用程序中保留回发的依赖关系?

时间:2009-03-07 11:39:22

标签: asp.net unity-container

msdn状态下统一框架的这个链接 您希望能够在Web应用程序中的回发中缓存或保留依赖项

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

我不确定上述声明的含义是什么 all 。 我正在寻找一个如何使用Unity来做到这一点的例子 - 不确定Unity将如何解决回发问题。它会在会话中保持依赖并将其恢复回来吗?

1 个答案:

答案 0 :(得分:1)

我写了一个使用Session并使用Cache的简短示例。我已经创建了一个名为incrementmenter的测试类,它非常类似于我使类静态或至少是变量。 RegisterInstance适用于Singleton Resolve

    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());
}

希望有帮助:

安德鲁

编辑:以下示例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());
}