Array
(
)

Singleton para conexão com o BD - Melhor forma

Rachel Andrade
   - 18 jun 2013

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:
#Código

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.

Thiagoporto
   - 18 jun 2013

O correto é assim

public static class Conexao {
private static SqlConnection _conexao;

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

0
|
0

Thiagoporto
   - 18 jun 2013

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

0
|
0

Rachel Andrade
   - 18 jun 2013

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:
#Código

Conexao.Getconexa().Open();
??
Parece meio estranho.

0
|
0

Rachel Andrade
   - 18 jun 2013

Desculpe, digitei errado.
O código é:
#Código

Conexao.GetConexao().Open()

e #Código
Conexao.GetConexao().Close()

Mas está estranho, hein.
Obrigada.

0
|
0

Thiagoporto
   - 18 jun 2013

É isso mesmo

0
|
0

Rachel Andrade
   - 19 jun 2013

Obrigada, Thiago.
Me tire uma última dúvida, por favor:
Se eu fizer assim está errado?
#Código

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.

0
|
0

Joel Rodrigues
   - 21 jun 2013

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.

0
|
0

Rachel Andrade
   - 24 jun 2013


Citação:
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.

0
|
0

Joel Rodrigues
   - 24 jun 2013

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

0
|
0