none
Validação em 3 camadas RRS feed

  • Pergunta

  •  

    Boa tarde para todos.

     

    Gostaria da ajuda de vocês para uma duvida que estou com relação à validação das informações quando programa em 3 camadas (ou N-Camadas).

    Estou desenvolvendo uma aplicação em .NET no VS 2005 em C# do tipo Windows Application.

    Pelo que pude entender a validação deve ficar na camada de Regra de Negócios, se bem que já vi exemplos onde à validação estava na camada de modelo (classe com o modelo dos dados).

    Minha duvida é como a camada de Regra de Negócios deve retornar para a camada de apresentação (Windows Application, Web, ...) caso houver uma inconsistência.

    Eu tinha pensado em provocar uma exceção e tratá-la (exibir uma mensagem para o usuário) pela camada de apresentação, mas pelo que sei uma exceção não seria uma boa alternativo, pois uma exceção “demora” um pouco.

     

    Qual o modo mais “elegante” para tratar este assunto?

     

    Desde já agradeço a ajuda.

     

    terça-feira, 26 de dezembro de 2006 19:16

Respostas

  • Denis,

    Eu sou a favor das exceções porque elas existem pra isso e funcionam muito bem. Além disso, a questão de performance - que parece ser seu questionamento - é insignificante por dois motivos. Primeiro, porque validação de usuário é interação do usuário que, naturalmente, já é lenta. Segundo, porque ela só ocorre em caso de erro, que é o menos comum.

    Além disso, neste caso, o que você vai ganhar em facilidade de manutenção e leitura de código compensa.

    Mas, de fato, não tenho muita experiência. Gostaria de saber outras opiniões, inclusive sobre essas justificativas - se fazem sentido.

    quarta-feira, 27 de dezembro de 2006 10:33
  • Olá amigos, em parte eu concordo com e. heringer uma solução que adotei foi .....

    Criar uma Classe chamada de BusinessClassException que herda de Exception

    using System;
    using System.Collections;

    namespace Business
    {
     /// <summary>
     /// This exception has all errors occurred in the business objects during data validation.
     /// Every business object raise a BusinessClassException when it find an validation error
     /// </summary>
     public class BusinessClassException: Exception
     {
      #region private fields
      /// <summary>
      /// List of error messages that raised the exception
      /// </summary>
      private ArrayList m_Errors;
      #endregion
      
      #region constructors
      /// <summary>
      /// Generate an exception with the specified error messages
      /// </summary>
      /// <param name="msgs">Arraylist with error messages</param>
      public BusinessClassException(ArrayList msgs)
      {
       m_Errors = msgs;
      }
      #endregion

      #region properties
      /// <summary>
      /// Get error messages
      /// </summary>
      public ArrayList Errors
      {
       get
       {
        return m_Errors;
       }
      }
      #endregion
     }
    }

    e pego todas as exceções de regra de negocio atraves dessa classe e listo todas na camada de apresentação .....

    Exemplo de como tratar esses errors na camada de negocio ....

    namespace Business
    {
     /// <summary>
     /// Summary description for Form.
     /// </summary>
     public class Form
     {
      private string        _fileName;
      private ArrayList       _errors = new ArrayList();

      /// <summary>
      /// Form FileName
      /// </summary>
      public string FileName
      {
       get
       {
        return _fileName;
       }
       set
       {
        if (value != null && value != String.Empty)
         _fileName = value;
        else
         _errors.Add("Form.InvalidFileName");
       }
      }

      public void Validate()
      {
       if (_errors.Count > 0)
        throw new BusinessClassException(_errors);
      }
     }
    }

    Espero ter ajudado

    Abraço[]s
    Artur Araújo

    quarta-feira, 27 de dezembro de 2006 11:07

Todas as Respostas

  • Denis,

    Eu sou a favor das exceções porque elas existem pra isso e funcionam muito bem. Além disso, a questão de performance - que parece ser seu questionamento - é insignificante por dois motivos. Primeiro, porque validação de usuário é interação do usuário que, naturalmente, já é lenta. Segundo, porque ela só ocorre em caso de erro, que é o menos comum.

    Além disso, neste caso, o que você vai ganhar em facilidade de manutenção e leitura de código compensa.

    Mas, de fato, não tenho muita experiência. Gostaria de saber outras opiniões, inclusive sobre essas justificativas - se fazem sentido.

    quarta-feira, 27 de dezembro de 2006 10:33
  • Olá amigos, em parte eu concordo com e. heringer uma solução que adotei foi .....

    Criar uma Classe chamada de BusinessClassException que herda de Exception

    using System;
    using System.Collections;

    namespace Business
    {
     /// <summary>
     /// This exception has all errors occurred in the business objects during data validation.
     /// Every business object raise a BusinessClassException when it find an validation error
     /// </summary>
     public class BusinessClassException: Exception
     {
      #region private fields
      /// <summary>
      /// List of error messages that raised the exception
      /// </summary>
      private ArrayList m_Errors;
      #endregion
      
      #region constructors
      /// <summary>
      /// Generate an exception with the specified error messages
      /// </summary>
      /// <param name="msgs">Arraylist with error messages</param>
      public BusinessClassException(ArrayList msgs)
      {
       m_Errors = msgs;
      }
      #endregion

      #region properties
      /// <summary>
      /// Get error messages
      /// </summary>
      public ArrayList Errors
      {
       get
       {
        return m_Errors;
       }
      }
      #endregion
     }
    }

    e pego todas as exceções de regra de negocio atraves dessa classe e listo todas na camada de apresentação .....

    Exemplo de como tratar esses errors na camada de negocio ....

    namespace Business
    {
     /// <summary>
     /// Summary description for Form.
     /// </summary>
     public class Form
     {
      private string        _fileName;
      private ArrayList       _errors = new ArrayList();

      /// <summary>
      /// Form FileName
      /// </summary>
      public string FileName
      {
       get
       {
        return _fileName;
       }
       set
       {
        if (value != null && value != String.Empty)
         _fileName = value;
        else
         _errors.Add("Form.InvalidFileName");
       }
      }

      public void Validate()
      {
       if (_errors.Count > 0)
        throw new BusinessClassException(_errors);
      }
     }
    }

    Espero ter ajudado

    Abraço[]s
    Artur Araújo

    quarta-feira, 27 de dezembro de 2006 11:07