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

como deveriamos lidar com o contexto.Dispose() ao utilizarmos o DAO?

Olá,

Já vi em varios lugares a utilização de "using(var contexto = new EntidadesContext()){ }" e ".Dispose()" na manipulação do contexto, nesse sentido, como deveriamos manipular o contexto na DAO?

3 respostas
solução!

Olá, Evandro!

Ambas abordagens estão corretas. Na verdade, a instrução using do .Net é uma daquelas coisas que chamamos de "açúcar sintático" (porque torna a vida do programador mais "doce"!)

Considere o código abaixo, que usa um bloco try-finally para criar um contexto do Entity Framework, adiciona um usuário à entidade Usuarios e ao final utiliza o método Dispose:

EntidadesContext contexto = new EntidadesContext();

try
{
    Usuario usuario = new Usuario()
    {
        Nome = "Fulano",
        Senha = "123"
    }
    contexto.Usuarios.Add(usuario);
    contexto.SaveChanges();
}
finally
{
    if (contexto != null)
        contexto.Dispose();
}

Agora considere o código equivalente "adoçado" com a instrução using:

using (EntidadesContext contexto = new EntidadesContext()) 
{
    Usuario usuario = new Usuario()
    {
        Nome = "Fulano",
        Senha = "123"
    }
    contexto.Usuarios.Add(usuario);
    contexto.SaveChanges();
}

Ou seja: quando o processamento sai do escopo do bloco, a variável que foi declarada dentro da instrução using (que obrigatoriamente deve implementar a interface IDisposable) é implicitamente marcada com o método Dispose, mesmo que ocorra uma exceção dentro do bloco.

Ambos produzem o mesmo resultado, porém quais as vantagens visíveis nessa segunda abordagem?

  • Menos linhas de código
  • Código mais legível
  • Melhor organização do código
  • Não precisamos invocar o método Dispose()

e o principal:

  • O bloco using logo de cara já revela a intenção do programador de usar uma variável que ao final do bloco será descartada.

Um abraço,

marcelo

Muito Obrigado pela resposta esclarecedora!

Agora me restou uma outra dúvida, no projeto do curso a classe DAO está instanciando o contexto do E.F. em seu construtor. Sendo assim, sabe me dizer se seria possível garantir seu ".Dispose()" automaticamente quando a classe não estiver mais sendo utilizada ou após o uso de qualquer método da classe?

Evandro, se você está passando o seu contexto pelo seu construtor, na minha opinião uma boa forma seria após a execução da rotina você executar o disponse no contexto, mais ou menos assim:

EntidadesContext contexto = new EntidadesContext();

try { Usuario usuario = new Usuario() { Nome = "Fulano", Senha = "123" } Usuarios usuarios = new Usuarios (contexto); usuarios .Gravar(usuario ); } catch { // MENSAGEM PARA DE INFORMAÇÃO... } finally { if (contexto != null) contexto.Dispose(); }

--------------- REPOSITÓRIO

public class Usuarios {

private readonly EntidadesContext contexto;

public xDAO(EntidadesContext contexto) { this.contexto = contexto; }

public void Gravar(Usuario novo){ try { contexto.Usuarios.Add(novo); contexto.SaveChanges(); } catch { throw; } finally { if (contexto != null) contexto.Dispose(); } }