Usuário com melhor resposta
Validação em 3 camadas

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.
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.
-
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
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.
-
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