Usuário com melhor resposta
Dúvidas sobre gerenciamento de conexões e containers de Injeção de dependencia.

Pergunta
-
Olaa,
Estou estudando Injeção de Dependencia (DI) juntamente com o Framework Ninject, mas um ponto que está me deixando bastante confuso é como um container de Injeção de Dependencia como o Ninject pode lidar com a abertura e fechamento de conexões com o banco de dados, segue abaixo o cenário:
1) Provedor de Dados: public class DataProvider : IProvider , IDisposable{ private SqlConnection connection = null; public DataProvider(string ConnectionString) { this.connection = new SqlConnection(ConnectionString); this.connection.Open(); } public object GetUniqueData(SqlCommand CommandSql){ ... ... } public void ExecuteInsertDeleteUpdate(SqlCommand CommandSql) { ... ... } } public void Dispose(){ if (this.connection != null) { this.connection.Close(); this.connection.Dispose(); } }
2) Data Acces Layer: Depende do Provedor acima para realizar operações no Banco de Dados. public class ManageBrandDAL : IManageBrandDAL { private IProvider provider = null; public ManageBrandDAL (IProvider provider_){ // A conexão já é recebida aberta. this.provider = provider_; } public void RegisterBrand(string a_BrandName){ SqlCommand SQLCommand = new SqlCommand("INSERT INTO Brand(name) VALUES(@pm_brandname)"); SqlParameter pm_brandname= new SqlParameter(); pm_brandname.ParameterName = "@pm_brandname"; pm_brandname.DbType = DbType.String; pm_brandname.Value = a_BrandName; comandoSQL.Parameters.Add(pm_brandname); this.provider.ExecuteInsertDeleteUpdate(SQLCommand); }
3) Container: Onde ocorre o mapeamento das dependências. public class ModuleInfra : Ninject.Modules.NinjectModule{ public override void Load(){ Bind<IProvider>().To<DataProvider ().WithConstructorArgument("ConnectionString", ManageConnection.ConnectionString); } }
Como pode ser obervado, a camada DAL precisa do Provider para realizar as operações com o Banco de Dados, essa dependencia é injetada no mesmo com a conexão já aberta, diante desse cenário segue as dúvidas:
1) No que se refere ao fechamento da conexão, o container que mapeia essas dependencias pode fechar a conexão automaticamente após o uso da mesma?
2) Se a resposta para a pergunta anterior for NÃO, qual a forma mais adequada de fechar a conexão no cenário acima ?
Desde Já, Agradeço.
- Editado _dev quarta-feira, 21 de novembro de 2012 03:25
Respostas
-
Rodrigo, justamente para não ter de esperar o Garbage Collector limpar os dados da memória fazendo o dispose automático é que se faz a herança da classe IDisposable, para que a sua aplicação possa limpar ela da memória justamente quando o uso do objeto não é mais necessário.
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :)- Marcado como Resposta _dev segunda-feira, 26 de novembro de 2012 01:47
Todas as Respostas
-
Amigo bom dia
olhando rapidamente seu código, vejo que se se você apôs a executção do código SQL chamar o dispose, a sua conexão será fechada. veja que não existe necessidade de deixar a conexão aberta após a utilização da mesma.
SqlParameter pm_brandname= new SqlParameter(); pm_brandname.ParameterName = "@pm_brandname"; pm_brandname.DbType = DbType.String; pm_brandname.Value = a_BrandName; comandoSQL.Parameters.Add(pm_brandname); this.provider.ExecuteInsertDeleteUpdate(SQLCommand); this.provider.Dispose(); }
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :) -
Prezado Olavo Oliveira,
Grato por sua atenção, mas era justamente isso que eu não queria fazer que era chamar o Dispose() após executar o comando Sql, eu gostaria de saber se o Container de DI pode fazer isso automaticamente após o uso da conexão, dessa forma eu não preciso ter a preocupação em dar Dispose() e Close() na conexão aberta.
Novamente obrigado.
-
Prezado Olavo Oliveira,
Grato por sua atenção, mas era justamente isso que eu não queria fazer que era chamar o Dispose() após executar o comando Sql, eu gostaria de saber se o Container de DI pode fazer isso automaticamente após o uso da conexão, dessa forma eu não preciso ter a preocupação em dar Dispose() e Close() na conexão aberta.
Novamente obrigado.
-
Rodrigo, justamente para não ter de esperar o Garbage Collector limpar os dados da memória fazendo o dispose automático é que se faz a herança da classe IDisposable, para que a sua aplicação possa limpar ela da memória justamente quando o uso do objeto não é mais necessário.
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :)- Marcado como Resposta _dev segunda-feira, 26 de novembro de 2012 01:47
-