Pergunta

Acho que é muito mais difícil de gerir a sua sessão em um aplicativo de desktop, porque você não pode tirar vantagem de um bondary tão clara como HttpContext. Então, como você gerenciar seu tempo de vida da sessão para tirar proveito de carregamento lento, mas sem ter uma sessão aberta para todo o aplicativo?

Foi útil?

Solução

Eu acho que se resume ao design de seus objetos. Porque carregamento lento pode ser executada no nível per-objeto, você pode tirar proveito desse fato quando você pensa sobre o gerenciamento de sessão.

Por exemplo, eu tenho um monte de objetos que são dados rico e preguiçoso carregado, e eu tenho uma exibição de grade / resumo e uma exibição de detalhes para eles. Na vista de grelha-resumo, eu não usar a versão lazy-carregado do objeto. I utilizar um objecto substituto para que os dados presentes, e que não é objecto substituto preguiçoso carregado.

Por outro lado, uma vez que um usuário seleciona esse registro para a visualização / edição, e você entra em um multi-paginado exibição de detalhes do objeto, que é quando nós aplicamos carregamento lento para o objeto específico. Os dados agora é preguiçoso carregado dependendo do que detalhes são vistos apenas sob demanda. Dessa forma, o escopo da minha sessão ser aberta para o carregamento lento só dura enquanto os detalhes de exibição está sendo usado.

Outras dicas

Ayende escreveu recentemente um ótimo artigo sobre o assunto na MSDN .

Como você disse antes, você não pode usar o limite do HttpRequest, mas você pode entender o que é um "HttpRequest" em sua aplicação desktop.

Deixe-me explicar. Normalmente, o seu HttpRequest será um controlador para uma ação e você irá limitar a sua sessão para que a ação específica. Agora em seu aplicativo de desktop os "controladores" (eventos) pode ser menor, mas como disse @ Jon, uma janela pode facilmente representar um limite:. Você trabalha com as coisas lá, deixá-los estar em sua sessão

Talvez possamos pensar em um padrão de Comando configurar. Cada evento significativo irá alimentar e acionar um comando, e executá-lo. A base AbstractCommand.Execute () implementação está a cargo de inicializar a sessão, envolvendo a transação, chamando a SomeCommand._Execute concreto () implementação e fechamento de todas as coisas.

De qualquer forma, isso está longe de ser a persistência agnóstico, como deve ser quando eu tiver carregado meu objeto e eu (querer) lidar apenas com casos simples (estou expecially referindo-se lazy-load aqui).

É outra forma possível de implementar algum tipo de comportamento auto-open / auto-fecha? Este deve ser realizado, fazendo persistência camada sensível às necessidades para consultas por camadas mais elevadas, mesmo nos casos implícitos tais como gatilhos preguiçoso-carga. Como para fechar a ligação, a camada de persistência pode fechar depois de um determinado tempo de espera (?) 10 segundos de inactividade DB. Eu sei, isso não é nítida. Mas seria realmente fazer camadas superiores persistência agnóstico.

Obrigado, Marcello

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