none
Dúvidas sobre gerenciamento de conexões e containers de Injeção de dependencia. RRS feed

  • 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 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
    quarta-feira, 21 de novembro de 2012 03:23

Respostas

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 :)

    quarta-feira, 21 de novembro de 2012 11:27
    Moderador
  • 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.

    quarta-feira, 21 de novembro de 2012 12:50
  • 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.

    quarta-feira, 21 de novembro de 2012 12:51
  • 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
    quarta-feira, 21 de novembro de 2012 13:03
    Moderador
  • Minha dúvida foi sanada.

    Grato a todos pela atenção.

    segunda-feira, 26 de novembro de 2012 01:46