Singleton para conexão com o BD - Melhor forma

18/06/2013

0

Oi de novo, gente.
Estou evoluindo, já estou me metendo a estudar padrões de projeto :p
Vi que o padrão Singleton diz pra criar uma única instância de um objeto e que uma das aplicações comuns é para conexões com o banco de dados. Correto até aqui, né?
Após várias pesquisas, encontrei uns exemplos, mas fiquei com dúvida sobre qual seria a melhor forma. Criei uma classe estática chamada Conexao e dentro dela uma propriedade SqlConnection. Então criei um método para acessar essa conexão externamente.
Poderiam me dar opiniões sobre a forma como estou fazendo?
Está assim:
public static class Conexao
{
	private static SqlConnection _conexao;

	public static SqlConnection GetConexao()
	{
		return _conexao;
	}
}


Aí tipo quando eu quero usar essa conexão eu chamo Conexao.GetConexao().

Muito obrigada.
Rachel Andrade

Rachel Andrade

Responder

Posts

18/06/2013

Thiago Porto

O correto é assim


public static class Conexao {
private static SqlConnection _conexao;

public static SqlConnection GetConexao()
{
if (_conexao == null)
_conexao = new SqlConnection();
return _conexao;
}
}
Responder

18/06/2013

Thiago Porto

Nao consegui colocar em bloco de código pq estou usando o IE, rs.
Responder

18/06/2013

Rachel Andrade

Ah, é verdade... boa sacada, hein rsrs obrigada, Thiago.
Da forma que estava não estava instanciando a SqlConnection.

Mas e pra abrir/fechar a conexão? Como eu faria isso externamente se a propriedade é privada e eu só a acesso a partir de um método?

Seria algo como:
Conexao.Getconexa().Open();
??
Parece meio estranho.
Responder

18/06/2013

Rachel Andrade

Desculpe, digitei errado.
O código é:
Conexao.GetConexao().Open()

e
Conexao.GetConexao().Close()

Mas está estranho, hein.
Obrigada.
Responder

18/06/2013

Thiago Porto

É isso mesmo
Responder

19/06/2013

Rachel Andrade

Obrigada, Thiago.
Me tire uma última dúvida, por favor:
Se eu fizer assim está errado?
SqlCommand cmd = new SqlCommand("instrução sql");
cmd.Connection = Conexao.GetConexao();

//Abrir a conexão:
cmd.Connction.Open();

//Executar o comando
cmd.ExecuteNonQuery();

//Fechar a conexão
cmd.Connection.Close()

Ou seja, eu abri e fechei a conexão a partir do cmd e não da classe Conexao diretamente.

Isso é aceitável segundo as boas práticas e padrões de projeto?

Obrigada mais uma vez.
Responder

21/06/2013

Joel Rodrigues

Olá, Rachel.
Eu particularmente não acho erado fazer dessa forma que você citou. Afinal, você não está acessando o objeto Conexao diretamente, mas sim qualquer SqlConnection que esteja ligada ao seu SqlCommand.
O resultado é o mesmo, mas eu optaria por usar a segunda forma, apenas para não ficar chamando o método GetConexao o tempo todo.
Responder

24/06/2013

Rachel Andrade

Olá, Rachel.
Eu particularmente não acho erado fazer dessa forma que você citou. Afinal, você não está acessando o objeto Conexao diretamente, mas sim qualquer SqlConnection que esteja ligada ao seu SqlCommand.
O resultado é o mesmo, mas eu optaria por usar a segunda forma, apenas para não ficar chamando o método GetConexao o tempo todo.
Obrigada então. Agora já tenho uma base de como proceder.
Dúvida tirada.
Obrigada a todos.
Responder

24/06/2013

Joel Rodrigues

Perfeito, Rachel.
Sendo assim, estou marcando o tópico como Concluído.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar