Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Implementação com Session e Objetos na session

Sei que o intuito do curso não foi de construir uma aplicação perfeita. O intuito é ensinar, mas não seria melhor trabalharmos sempre com session e somente na hora da checkout acessarmos o banco? Outra dúvida, como fazemos para gravar objetos na session no MVC core? É possível?

4 respostas

Olá Diogo,

cada implementação do carrinho da verdade tem sua vantagem e desvantagem. De fato, a estratégia que o pessoal mais usa para fazer carrinhos de compra em geral é guardar na sessão e só no final de tudo persistir no banco, que consome muito menos conexões e querys com o banco de dados. Só que toda vez que estamos trabalhando com session, ela está atrelada com um cookie na máquina do usuário. Então se o usuário desabilitar, limpar os cookies ou até deslogar da aplicação, o carrinho de compras acaba se perdendo. Já salvar as coisas no banco tem essa vantagem que não depende de nada que esteja no navegador do usuário. Mesmo que o usuário até deslogue estará tudo salvo no banco. Porém , dá bem mais trabalho de manutenção justamente porque toda hora será necessário ficar recuperando do banco de dados as informações do carrinho.

Falando especificamente do session feito para o .net core, ele tem um probleminha que ele consegue gravar apenas string, int ou array de bytes. Geralmente para o pessoal conseguir gravar um objeto eles criam uma extensão que converte o objeto para json e salva na session. Neste link mostra como a session funciona no core e inclusive tem esta extensão mencionada.

solução!

Olá, Diogo

O intuito é ensinar, mas não seria melhor trabalharmos sempre com session e somente na hora da checkout acessarmos o banco?

Depende. Numa aplicação de e-commerce, você pode estar usando o celular para colocar vários itens no carrinho e, de repente, fica sem conexão com internet por algumas horas. Quando voltar a acessar, de casa, usando um notebook, percebe que seu carrinho está vazio. Esse é um problema que pode ser evitado quando persistimos as ações do usuário num banco relacional ou num outro banco No-SQL.

Outra dúvida, como fazemos para gravar objetos na session no MVC core? É possível?

Podemos criar uma classe de extensão para ler/gravar objetos serializados, utilizando internamente os métodos GetString e SetString que são nativos da session:

using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;

public static class SessionExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    public static T Get<T>(this ISession session,string key)
    {
        var value = session.GetString(key);
        return value == null ? default(T) : 
                              JsonConvert.DeserializeObject<T>(value);
    }
}

Obrigado a ambos.

Obrigado por participar do fórum, Diogo. Sempre às ordens.