Pergunta

Eu li algumas abordagens para armazenar viewstate no servidor:

Aqui é um

Aqui é outro

Mas eles são uma espécie de complicado. Eu estou procurando uma maneira de manter um objeto sem ter para serializar-lo. Eu poderia usar o estado da sessão, mas se um usuário abrir mais de uma janela, pode haver substituições do objeto.

Existe uma solução simples para isso?

Foi útil?

Solução

Nesta situação eu iria colocar armazenar o objeto na sessão usando uma chave única e amarrar a chave para a página. Tudo isso pode ser captada em propriedades na classe de página.

public string PersistanceKey
{
    get { 
        if(ViewState["PersistanceKey"] == null)
           ViewState["PersistanceKey"] = "Object" + Guid.NewGuid().ToString();

        return (string)ViewState["PersistanceKey"];
    }
}

public PersistanceObject Persistance
{
    get {
        if(Session[this.PersistanceKey] == null)
            Session[this.PersistanceKey] = new PersistanceObject();

        return (PersistanceObject)Session[this.PersistanceKey];
}

As chaves de sessão diferentes permitiria objetos diferentes em uma base por página. Como alternativa, em vez de usar o objeto de sessão, você poderia pensar em usar o cache de aplicativo (o objeto Cache) para remover automaticamente entradas velho para fora da memória, mas isso tem suas próprias advertências.

Deve-se notar que as advertências de Joel em sua resposta sobre o uso de memória são totalmente precisos. Isto pode não ser a melhor idéia para baixo memória, de alto uso ou cenários de grande persistência a objetos.

Outras dicas

Eu estou procurando uma maneira de manter um objeto sem ter para serializar-lo.

Tenha cuidado com isso. Isto terá um impacto dramático sobre a utilização de memória de seu site, e uso de memória é muitas vezes o maior impedimento para escalabilidade.

Atribuir um número a cada janela o usuário pode abrir. Anexar esse número para a chave de sessão. Você também deve armazenar a algum lugar número na página (querystring ou uma entrada escondida) para ser capaz de recuperar a variável de sessão apropriado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top