Session Manager - WPF | Windows Form

28 views
Skip to first unread message

Heitor Ricardino Barros

unread,
Aug 9, 2016, 8:47:52 AM8/9/16
to NHibernate-Br
Fala galera. Blz?

To aqui pensando em algumas implementações para o ciclo de vida da session em um novo projeto windows forms ou WPF, ainda não decidi qual.

Mas, seguinte. To pensando em criar uma classe para as viewmodels que encapsulam a session e mantem ela ativa durante a instancia do formulário. O que vocês acham?

Estou utilizando o SimpleInject para DI e o NH 4.0.4. Estou usando também o padrão DDD.

Paulo Quicoli

unread,
Aug 9, 2016, 9:00:10 AM8/9/16
to nhiber...@googlegroups.com
Vc não pensou em ter um servidor de app em WCF e seu app WPF ser um 'client' ? Tenho feito apps desktop dessa forma...

--
Você recebeu essa mensagem porque está inscrito no grupo "NHibernate-Br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-br+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para nhiber...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/nhibernate-br.
Para mais opções, acesse https://groups.google.com/d/optout.

Heitor Ricardino Barros

unread,
Aug 9, 2016, 9:07:19 AM8/9/16
to NHibernate-Br
Poderia ser. Mas essa aplicação especificamente deve funcionar sem utilizar o servidor. Pq é offline-first .


Em terça-feira, 9 de agosto de 2016 10:00:10 UTC-3, Quicoli escreveu:
Vc não pensou em ter um servidor de app em WCF e seu app WPF ser um 'client' ? Tenho feito apps desktop dessa forma...
Em 9 de agosto de 2016 09:47, Heitor Ricardino Barros <heitor...@gmail.com> escreveu:
Fala galera. Blz?

To aqui pensando em algumas implementações para o ciclo de vida da session em um novo projeto windows forms ou WPF, ainda não decidi qual.

Mas, seguinte. To pensando em criar uma classe para as viewmodels que encapsulam a session e mantem ela ativa durante a instancia do formulário. O que vocês acham?

Estou utilizando o SimpleInject para DI e o NH 4.0.4. Estou usando também o padrão DDD.

--
Você recebeu essa mensagem porque está inscrito no grupo "NHibernate-Br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-b...@googlegroups.com.

Paulo Quicoli

unread,
Aug 9, 2016, 9:14:15 AM8/9/16
to nhiber...@googlegroups.com
um servidor WCF não precisa estar na web...  pode ser uma máquina da rede, se é apenas um computador... pode ser o mesmo computador... dessa forma vc está pronto pra escalonar e centralizar regras na app servidora... se amanhã as coisas crescerem no cliente, e ele quiser expor algo na Web, vc cria uma camada sobre o WCF pra expor os dados da melhor que achar...

Mas se vc nunca fez nada com WCF, aconselho dar uma estudada antes...

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-br+unsubscribe@googlegroups.com.

Heitor Ricardino Barros

unread,
Aug 9, 2016, 9:30:14 AM8/9/16
to NHibernate-Br
Acabei não pensando no Self-Host da app. Não gosto do WCF por que tenho que acoplar todos os objetos a ele e sair criando classe e interfaces pra praticamente tudo. Algo me diz que acoplar domínio a uma tecnologia específica não é bom e, mano do céu, não quero ter que criar DTO pra tudo visando contornar esse problema de acoplamento.

Posso até criar uma API ou algo com WCF. Mas, é tanto trabalho para um coisa tão simples.

Estou pensando aqui em algo para gerenciar a session. Tipo uma session per presenter.

Edno Silva

unread,
Aug 9, 2016, 10:13:13 AM8/9/16
to nhiber...@googlegroups.com
Estou usando "Session por Evento" em Windows Forms. Isso meio que emula o "Session per Request" de um sistema Web. Na prática, sempre que o sistema fica parado/ocioso, eu fecho a Session.

No Program.cs:

            EventHandler liberadorRecursosTemporarios = (sender, e) => Infraestrutura.LiberarRecursosTemporarios();

            Application.Idle += liberadorRecursosTemporarios;
            Application.EnterThreadModal += liberadorRecursosTemporarios;

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            FrmPrincipal = new FrmPrincipal();
            Application.Run(FrmPrincipal);

            Application.Idle -= liberadorRecursosTemporarios;
            Application.EnterThreadModal -= liberadorRecursosTemporarios;


O método estático Infraestrutura.LiberarRecursosTemporarios() dá um close na session atual.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-br+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para nhiber...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/nhibernate-br.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Sem mais,
Edno.

Heitor Ricardino Barros

unread,
Aug 9, 2016, 10:37:32 AM8/9/16
to NHibernate-Br
Legal cara. Vou da uma olhada. O problema é os lazy da vida. Quando fecha a sessão da ruim. Como você lhe da com isso?
Sem mais,
Edno.

Edno Silva

unread,
Aug 9, 2016, 10:56:51 AM8/9/16
to nhiber...@googlegroups.com
Usar o Lazy Load na Camada de Apresentação não é legal. Já que você falou de DDD, evite manipular seus objetos de domínio na Camada de Apresentação. Evite guardar os objetos do domínio em variáveis dos formulários. Você pode, por exemplo, usar DTOs para apresentar os dados na tela.

Eu tenho um sistema que ainda não usa isso de "Session por Evento". quando fui alterar o sistema para usar isso, deu um monte de erros de Lazy Load. Resultado: desisti.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-br+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para nhiber...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/nhibernate-br.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Sem mais,
Edno.

Heitor Ricardino Barros

unread,
Aug 9, 2016, 12:20:34 PM8/9/16
to NHibernate-Br
Pois é Edno. To pensando bem como fazer.

Heitor Ricardino Barros

unread,
Aug 10, 2016, 4:03:16 PM8/10/16
to NHibernate-Br
Fala galera!

Vou explicar como resolvi, ainda tem alguns problemas de design mas vou dar uma melhorada.

Atualmente quem controla a vida útil de uma session é o meu container de DI, SimpleInjector. Com o container instancio as sessões do NHibernate assim: 
using (Bootstrapper.ObterContainerConfigurado().BeginLifetimeScope())                
{
  var produtoRepositorio = Bootstrapper.ObterContainerConfigurado().GetInstance<ProdutoRepositorio>();
  //etc....
}

Quando o bloco using acabar é invocado o dispose dos objetos como nos já sabemos.

Para o problema com os dados trafegados entre os formulários, obtenho usando joinalias. Em alguns casos que uso viewmodels ou dtos faço:
public class DTOItemPedido
    {
        public DTOItemPedido(ProdutoReduzido produtoReduzido, int quantidade, decimal valorUnitario)
        {
            NHibernateUtil.Initialize(produtoReduzido);

            ProdutoReduzido = produtoReduzido;
            Quantidade = quantidade;
            ValorUnit = valorUnitario;            
        }

        public ProdutoReduzido ProdutoReduzido { get; set; }        
        public int Quantidade { get; set; }
        public decimal ValorUnit { get; set; }
        public decimal Desconto { get; set; }
    }

A priori é nisso que pensei. Vou ver se dou uma melhorada e se quiserem compartilhar algo sobre a solução, estamos ai. :)

Juliano Oliveira

unread,
Aug 10, 2016, 4:44:04 PM8/10/16
to nhiber...@googlegroups.com
Heitor,

Eu trabalho mais com aplicações web, porém, até onde sei, o recomendado em aplicações desktop é que as sessions do nhibernate seja única para a aplicação toda. Ou seja, abriu a aplicação você já deve abrir uma ISession e coloca-la no container de DI. Eu acho que não vale a pena você usar session por evento. Você só tem que tomar cuidado com o que o NHibernate deve manter carregado na session para não ter coisa demais na memória.

Outra coisa, se você está usando WPF com arquitetura MVVM você não deve acoplar sua ViewModel no NHibernate. O recomendado é sempre fazer aquele trabalho de formiga de obter os dados do NHibernate, trasforma-los na sua ViewModel e vice-versa. Você deve manter seu DDD completamente desacoplado do MVVM.

Abraço,

Juliano Oliveira

--
Você recebeu essa mensagem porque está inscrito no grupo "NHibernate-Br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-br+unsubscribe@googlegroups.com.

Heitor Ricardino Barros

unread,
Aug 10, 2016, 4:52:07 PM8/10/16
to NHibernate-Br
Juliano,

Se manter uma session a aplicação toda ela acaba explodindo e gerando n problemas de memoria. A session foi feita para ter uma vida útil muito curta, por isso funciona tão bem na web.

Então como falei utilizo o máximo os joins para trazer as coleções necessário para a viewmodel ou code behind, ainda não decidi se vou wpf ou wf, estou focado somente no dominio e na infra. Em casos específicos, utilizo o NHibernateUtil para inicializar o objeto para o DTO, select N+1 :(, mas é o que temos pra hoje.rsrsrs.

Sobre o DDD o dominio. Ele nem sabe que existe o nhibernate no projeto. Acho que só tem a lib System....

Mas, valeu pela observação.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-b...@googlegroups.com.

Juliano Oliveira

unread,
Aug 10, 2016, 5:02:46 PM8/10/16
to nhiber...@googlegroups.com
Heitor,

É, tem razão. Faz muito tempo que não faço aplicações desktop.
Estive pesquisando e achei um artigo do Ayende, parece perfeito para ajudar nas tuas ideias. Dá uma olhada:


Abraço,

Juliano Oliveira

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-br+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages