Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como criar uma ISession e usar em toda Loja WEB

Olá, bom dia!!!

Estou fazendo as atividades do "Cadastro de entidades no projeto WEB". Não estou conseguindo criar e usar uma única ISession para toda a loja. Até o momento fiz o seguinte:

  1. No HomeControler, criei a ISession:

    public class HomeController : Controller
    {
        public ISession session;

        public ActionResult Index()
        {
            session = AbreSession();
            return View();
        }

        public ISession AbreSession()
        {
            ISession session = NHibernateHelper.AbreSession();

            return session;
        }
    }
  1. No ProdutosDAO, fiz o método adiciona, que usa a Session informado na instanciação da classe:
        private ISession session;

        public ProdutosDAO(ISession session)
        {
            this.session = session;
        }

        public void Adiciona(Produto produto)
        {
            ITransaction transaction = session.BeginTransaction();
            session.Save(produto);
            transaction.Commit();
        }
  1. E quando vou adicionar o produto, na classe ProdutosController, não consigo passar o session do HomeController (HomeController.session), ocorrendo erro de compilação .
       public ActionResult Adiciona(Produto produto)
        {
            ProdutosDAO produtoDAO = new ProdutosDAO(HomeController.session);//erro nessa linha
            produtoDAO.Adiciona(produto);
            return RedirectToAction("Index");
        }

Eu até poderia alterar para não precisar passar a Session criada no HomeController, porém de qualquer forma, preciso ter acesso a ela. Enfim, aguardo sugestões para correção de meu problema.

Atenciosamente.

1 resposta
solução!

Oi Helder

Eu não entendi direito a sua dúvida, mas me parece que você está tentando utilizar apenas uma única instância de ISession para atender todas as requisições da aplicação. É isso mesmo?

Se sim, essa não é uma estratégia utilizada em aplicações web, pois a session não é um objeto que pode ser compartilhada entre diversas threads do servidor (não podemos utilizar a mesma session para atender duas requests simultâneas sem tem problemas de concorrência). Ao invés disso, a estratégia utilizada é abrir uma session por request e compartilhar a instância apenas dentro da requisição web que está sendo atendida. Essa estratégia é implementada no exercício 11 do segundo capítulo do curso.