none
Instanciar métodos aspx .net RRS feed

  • Pergunta

  •  Boa tarde craques de aspx. net, tudo bem?

    Uma dúvida, sobre instanciar métodos!

    Vou tentar explicar passo a passo direitinho:
    No meu cadastro eu tenho os botões Create | Save | Cancel...todos os meu campos abrem como enable  = false, quando clicar em create eu chamo uma classe chamada "Metodos_Form", nela eu tenho o seguinte método...

            public void HabilitaForm (ControlCollection controle) 
            { 
                foreach (Control txtBox in Controls) 
                { 
                    if (txtBox is TextBox) 
                    { 
                        (txtBox os TextBox). enabled = true; 
                    }                 HabilitaForm (txtBox.Controls);             }         }



    e então quando clico em Create eu faço:
            GerenciaFormularios Visible = new GerenciaFormularios();
                VisibleNClean.HabilitaForm(this.Controls);

    pois é, nessa minha tela de cadastro tenho 2 abas (Cadastro | Seleção), na de seleção tenho um gridview, onde cada linha possuo um btn de alteração, quando clico em alterar ele me joga na Aba Cadastro onde preencho para o user todos os campos com as informações da table.
    Sendo assim, quando o user clica em alterar as informações são lançadas no campo, porém como eu disse eles estão enable = false, sendo assim tenho q chamar de novo meu metodo:
            GerenciaFormularios Visible = new GerenciaFormularios();
                VisibleNClean.HabilitaForm(this.Controls);

    Existe alguma forma de instanciar uma vez só? 

    Outro exemplo:

    Este meu sisteminha é multibancos (Pelo menos eu acho que isso q estou fazendo é multibanco) Ex:
    tenho 1 DB - que tem o nome das empresas + usuários:
    Quando ele se loga, eu pego o nome da empresa dele e joga numa Session, sendo assim cada consulta, cada vez que chamo minha cadama DAL tenho que passar:

            dbConsultClient.Db_empresa = Session["db_empresa"].ToString();

    para ele saber de qual banco este user refere-se, se por algum momento eu esquecer de colocar isto **** ferrou.. vai dar erro.

    Será que consegui me explicar? meio complicado = \

    Mesmo assim agradeço quem puder ajudar =) 

    quinta-feira, 24 de maio de 2012 21:46

Respostas

  • Olá Douglas não sei se entendi bem sua dúvida mas uma maneira de não precisar instanciar, seria você tornar seu método Static.. Ex.:

      public static void HabilitaForm (ControlCollection controle) 
            { 
                foreach (Control txtBox in Controls) 
                { 
                    if (txtBox is TextBox) 
                    { 
                        (txtBox os TextBox). enabled = true; 
                    }                 HabilitaForm (txtBox.Controls);             }         }
    
    
    
    
            //Chamaria ele assim onde precisar:
            GerenciaFormularios.HabilitaForm(this.Controls);

    Abraços e espero ter ajudado!


     "Feliz aquele que transfere o saber e aprende o que ensina."(Cora Coralina)


    Pablo Batista Cardoso
    www.pablobatistacardoso.com.br
    pablobatistacardoso@hotmail.com

    • Marcado como Resposta Harley Araujo segunda-feira, 28 de maio de 2012 14:04
    sexta-feira, 25 de maio de 2012 17:38
  • Olá:

    1ª questão:

    Uma forma de instanciar uma vez só é manter a instância global, ou seja, fora do contexto da sua chamada (acima dela), mas não recomendo, afinal você só precisa da instância na hora de usá-la, seria manter lixo na memória a toa.
    Para uma melhor performance sugiro que transforme essa classe em estática "static", mas utilize um pattern de Singleton, pois para cada chamada de uma classe estática você aloca um bloco de memória! Imagina isso sendo chamado 100x por minuto? O GC não dá conta sempre.

    Um ex de classe Singleton:

    public sealed class GerenciaFormularios
    {
        #region " Singleton "
            private static GerenciaFormularios _getInstance = null;
    
            private static object _syncRoot = new object();
            private GerenciaFormularios()
            {
            }
    
            public static GerenciaFormularios Instance
            {
                get
                {
                    if (_getInstance == null)
                    {
                        lock (_syncRoot)
                        {
                            if (_getInstance == null)
                            {
                                _getInstance = new GerenciaFormularios();
                            }
                        }
                    }
                    return _getInstance;
                }
            }
        #endregion  
    
        public void HabilitaForm(ControlCollection controle)
        { 
            // Faz alguma coisa!
        }
    }

    Chamando a sua classe Singleton:

    GerenciaFormularios.Instance.HabilitaForm(this.Controls);

    *Note que para chamar o método da classe precisa sensibilizar a "Instance" ou seja, você está usando o Singleton. (a memória do servidor agradece!)

    2ª questão:

    Para evitar de chamar toda hora e possivelmente esquecer essa atribuição sugiro que use uma classe baseDAO e faça ela chamar a sessão.
    Exemplo:

    // Use essa referencia no código e também de um ADD REFERENCE desta DLL no seu projeto.
    using System.Web;
    
    // Essa é sua classe base, faça todas suas DAO herdarem ela!
    public class BaseDAO
    {
        // Essa é sua propriedade! Sempre atribua esta propriedade nos seus métodos.
        public string EmpresaLogadaNoSistema
        {
            get { return HttpContext.Current.Session["db_empresa"].ToString(); }
        }
    }
    
    // Esse é um exemplo de uma classe DAO qualquer! Herda BaseDAO
    public class ClienteDAO : BaseDAO
    {
        // Método de acesso ao BD
        public void AtualizaBancoDeDados()
        {
            // Se você atribuir o Db_empresa à propriedade que criou na BaseDAO nunca mais vai precisar se preocupar em preenche-la! 
            // Ao chamar o método da DAO ele já virá preenchido!
            string Db_empresa  = EmpresaLogadaNoSistema;
    
            // Faz outras coisas. Consulta banco / UPDATE/ DELETE
        }
    }

    Não esqueça de marcar a resposta se por acaso conseguimos te ajudar, caso não continue postando ;)

    Abraço!


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    • Marcado como Resposta Harley Araujo segunda-feira, 28 de maio de 2012 14:04
    sexta-feira, 25 de maio de 2012 18:49

Todas as Respostas

  • Olá Douglas não sei se entendi bem sua dúvida mas uma maneira de não precisar instanciar, seria você tornar seu método Static.. Ex.:

      public static void HabilitaForm (ControlCollection controle) 
            { 
                foreach (Control txtBox in Controls) 
                { 
                    if (txtBox is TextBox) 
                    { 
                        (txtBox os TextBox). enabled = true; 
                    }                 HabilitaForm (txtBox.Controls);             }         }
    
    
    
    
            //Chamaria ele assim onde precisar:
            GerenciaFormularios.HabilitaForm(this.Controls);

    Abraços e espero ter ajudado!


     "Feliz aquele que transfere o saber e aprende o que ensina."(Cora Coralina)


    Pablo Batista Cardoso
    www.pablobatistacardoso.com.br
    pablobatistacardoso@hotmail.com

    • Marcado como Resposta Harley Araujo segunda-feira, 28 de maio de 2012 14:04
    sexta-feira, 25 de maio de 2012 17:38
  • Olá:

    1ª questão:

    Uma forma de instanciar uma vez só é manter a instância global, ou seja, fora do contexto da sua chamada (acima dela), mas não recomendo, afinal você só precisa da instância na hora de usá-la, seria manter lixo na memória a toa.
    Para uma melhor performance sugiro que transforme essa classe em estática "static", mas utilize um pattern de Singleton, pois para cada chamada de uma classe estática você aloca um bloco de memória! Imagina isso sendo chamado 100x por minuto? O GC não dá conta sempre.

    Um ex de classe Singleton:

    public sealed class GerenciaFormularios
    {
        #region " Singleton "
            private static GerenciaFormularios _getInstance = null;
    
            private static object _syncRoot = new object();
            private GerenciaFormularios()
            {
            }
    
            public static GerenciaFormularios Instance
            {
                get
                {
                    if (_getInstance == null)
                    {
                        lock (_syncRoot)
                        {
                            if (_getInstance == null)
                            {
                                _getInstance = new GerenciaFormularios();
                            }
                        }
                    }
                    return _getInstance;
                }
            }
        #endregion  
    
        public void HabilitaForm(ControlCollection controle)
        { 
            // Faz alguma coisa!
        }
    }

    Chamando a sua classe Singleton:

    GerenciaFormularios.Instance.HabilitaForm(this.Controls);

    *Note que para chamar o método da classe precisa sensibilizar a "Instance" ou seja, você está usando o Singleton. (a memória do servidor agradece!)

    2ª questão:

    Para evitar de chamar toda hora e possivelmente esquecer essa atribuição sugiro que use uma classe baseDAO e faça ela chamar a sessão.
    Exemplo:

    // Use essa referencia no código e também de um ADD REFERENCE desta DLL no seu projeto.
    using System.Web;
    
    // Essa é sua classe base, faça todas suas DAO herdarem ela!
    public class BaseDAO
    {
        // Essa é sua propriedade! Sempre atribua esta propriedade nos seus métodos.
        public string EmpresaLogadaNoSistema
        {
            get { return HttpContext.Current.Session["db_empresa"].ToString(); }
        }
    }
    
    // Esse é um exemplo de uma classe DAO qualquer! Herda BaseDAO
    public class ClienteDAO : BaseDAO
    {
        // Método de acesso ao BD
        public void AtualizaBancoDeDados()
        {
            // Se você atribuir o Db_empresa à propriedade que criou na BaseDAO nunca mais vai precisar se preocupar em preenche-la! 
            // Ao chamar o método da DAO ele já virá preenchido!
            string Db_empresa  = EmpresaLogadaNoSistema;
    
            // Faz outras coisas. Consulta banco / UPDATE/ DELETE
        }
    }

    Não esqueça de marcar a resposta se por acaso conseguimos te ajudar, caso não continue postando ;)

    Abraço!


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    • Marcado como Resposta Harley Araujo segunda-feira, 28 de maio de 2012 14:04
    sexta-feira, 25 de maio de 2012 18:49