Как сохранить зависимости между постбэками в веб-приложении с использованием Unity? - PullRequest
0 голосов
/ 07 марта 2009

Эта ссылка для структуры единства в состояниях MSDN " Вы хотите иметь возможность кэшировать или сохранять зависимости между постбеками в веб-приложении "

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

Я не уверен, что all означает приведенное выше утверждение. Я ищу пример того, как мы можем сделать это с помощью Unity - не уверен, как Unity будет разрешать постбэки. Будет ли оно просто сохранять зависимость в сеансе и получать его обратно?

1 Ответ

1 голос
/ 08 марта 2009

Я написал короткий пример использования Session, а также использования Cache. Я создал тестовый класс с именем incrementer, который очень похож на класс статический или хотя бы на переменную. RegisterInstance - для разрешения синглтона

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

Надеюсь, что это поможет:

Andrew

РЕДАКТИРОВАТЬ: В следующем примере 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()); }

...