Validation Application Block, Data Annotation ou Code Contracts?

98 views
Skip to first unread message

Alexsandro

unread,
Mar 15, 2013, 12:40:11 AM3/15/13
to dotnetar...@googlegroups.com

Ola a todos, estou desenvolvendo um camada de dominio de uma aplicação usando TDD. Eu gostaria de saber de voces, o que voces estão usando para garantir as regras de negocio como por exemplo:

  • Propriedade nome não pode ser nula ou vazia.
  • Quantidade de caracteres tem que ter no minimo 3.
  • E etc.


Eu comecei usando Code Contracts, mas lendo a respeito, me lembrei do Validation Application Block do Enterprise Library e vi poucos exemplos.

Mas quanto a vocês? O que tem costume de usar quando se trantando de entidades de dominino?

Daniel

unread,
Mar 15, 2013, 7:37:59 AM3/15/13
to dotnetar...@googlegroups.com
String.IsNullOrEmpty,       string.length > 3


--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você está recebendo esta mensagem porque se inscreveu no grupo ".Net Architects" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para dotnetarchitec...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Alexsandro

unread,
Mar 15, 2013, 9:58:15 AM3/15/13
to dotnetar...@googlegroups.com
Entao Daniel, estou usando exemplos como String.IsNullOrEmpty, string.length > 3 com Code Contracts para garantir os testes, mas minha duvida é em relação o que voces estão usando.

Se o pessoal indica Validation Application Block ou Data Annotation ou Code Contracts.

Valew.

Wesley Baldan

unread,
Mar 15, 2013, 9:35:08 AM3/15/13
to dotnetar...@googlegroups.com
Gostei muito de utilizar Design By contracts.......

Alexsandro

unread,
Mar 15, 2013, 11:04:08 AM3/15/13
to dotnetar...@googlegroups.com
Wesley, Code Contracts é a lib de Design By Contracts da Microsoft não é?

Uma outra questão que ainda não testei é que as exceções por exemplo:

Contract.Requires<ArgumentOutOfRangeException>(pVermelho >= 0 && pVermelho <= 255);

Se elas seram disparada na aplicação em produção ou apenas pelos testes do MSTest por exemplo. Pois eu vi que estes metodos são obtidos pelo compilador.

Sabe algo a respeito?

Valew!

Alexsandro

unread,
Mar 15, 2013, 11:05:04 AM3/15/13
to dotnetar...@googlegroups.com
obtidos não omitidos!

edmilson hora

unread,
Mar 15, 2013, 1:00:01 PM3/15/13
to dotnetar...@googlegroups.com
@Alessandro,

há algum motivo espacial, para querer usar  esses  frameworks para validação das suas regras de dominio?

Ao que sei, por questões de simplicidade, e geralmente é o que faço, cologo minhar regras de validação num metodo na propria classe e ao instanciar chamo o metodo de validação, mas isso é uma particuladidade dos projetos que eu trabalho pode ser que  outros necessitam usar algo mais elaborado.

[]´s

Edmilson



De: Alexsandro <bagu...@gmail.com>
Para: dotnetar...@googlegroups.com
Enviadas: Sexta-feira, 15 de Março de 2013 1:40
Assunto: [dotnetarchitects] Validation Application Block, Data Annotation ou Code Contracts?

Alexsandro

unread,
Mar 15, 2013, 11:18:13 PM3/15/13
to dotnetar...@googlegroups.com, edmilson hora
@Edmilson, a ideia é garantir que tenha objetos de entidade de negocio sempre válidos da forma mais transparente possivel.

A sua ideia de ter um metodo que valide a entidade de dominio é válida sim, mas e quanto estes 3 modelos de trabalho/(forma de trabalhar) que eu disse? Gostaria de saber qual deles tambem são validos para este proposito e ver se alguem as ultimizam.

Quanto ao meu projeto, é um projeto novo de migração de um legado.

Valew!!

Alexsandro

unread,
Mar 16, 2013, 12:01:18 AM3/16/13
to dotnetar...@googlegroups.com, edmilson hora
Achei este site, http://gorodinski.com/blog/2012/05/19/validation-in-domain-driven-design-ddd/ e pelo que eu li aparentemente existe N formas pra fazer o que eu quero e todas estão validas, inclusive @Edmilson o seu modelo é citado no texto chamado de validação adiada sendo que eu procurava quando escrevi este post uma forma mais atômica de se validar como é dita tambem no texto.

Eu tenho visto que code contracts apenas funciona de forma atômica quando estamos no contexto de teste(se alguem souber fazer como funcionar em produçao se for valido, me avisem).

Estou pensando agora seriamente usar de forma atômica um throw new Exception("campo invalido por isto e por isto.").

Alguem tem algo contra?

Valew.


Em sexta-feira, 15 de março de 2013 14h00min01s UTC-3, Edmilson escreveu:

edmilson hora

unread,
Mar 16, 2013, 8:20:58 AM3/16/13
to dotnetar...@googlegroups.com
@Alessandro,  essa forma atomica que vc quer usar não necessita de nehum desses frameworks de validação, na abordagem que uso,  vou adicionando  as validações  a um List  de "regrasQuebradas" e ao final verifico  se esta lista esta vazia, se ela não estiver, lanço uma exception  e retorno a lista  com todas as regras que que foram quebradas, com  isso,  todos  os objetos envolidos na operação  foram validados  e  o Usuario do sistema recebeu apenas  um excessão  informando  todas as regras que não estão sendo respeitadas.

[]´s

Edmilson

Cc: edmilson hora <edmils...@yahoo.com.br>
Enviadas: Sábado, 16 de Março de 2013 1:01
Assunto: Re: [dotnetarchitects] Validation Application Block, Data Annotation ou Code Contracts?

Carlos Mendes

unread,
Mar 16, 2013, 9:28:10 AM3/16/13
to dotnetar...@googlegroups.com
Alessandro, 

Estou utilizando o fluent validation para implementar regras de validação. O framweork atendeu bem todos os casos que você citou e vários outros.

Estou utilizando ele dentro da camada de negocio. Uma classe é criada para validar cada entidade. Essa classe tem um método Validate que pode ser chamado quando precisar. Existe duas formas de utilizar: Baseado em exceptions ou mensagens. Ele tem outras customizações e um framework para fazer testes unitarios.





--
Carlos Mendes

Marcelo Acioli Bastos

unread,
Mar 16, 2013, 9:37:31 AM3/16/13
to dotnetar...@googlegroups.com
Alessandro Data annotation, usa ai. acho muito melhor, ja utilizei em alguns projetos que participei e foi muito bom.
Marcelo Bastos
Analista de sistemas
85-9997-3280
http://www.marceloaccioly.blogspot.com/

Alexsandro

unread,
Mar 16, 2013, 11:25:29 AM3/16/13
to dotnetar...@googlegroups.com, edmilson hora
Então @Edmilson, @Carlos, @Marcelo,

Esta noite passada eu lembrei do do livro N-Layer que a Microsoft disponibilizou em 2010 ~ 2011 nesta URL http://microsoftnlayerapp.codeplex.com/documentation e comecei a ler a parte de Domain Model Layer que me ajudou muito a ver o que eles usavam a 2 anos atras. Eu li a versão 1 e versão 2 que se encontra nesta página para download.

Este documento vai me guiar bem para que eu consiga fazer o que gostaria de uma boa forma. No captulo de Entity Validate eles citam Data Annotation e Fluent API como o @Carlos disse que usa, e tambem a forma atômica( uso de exceptions ). Eu vou acabar provavelmente abandodar o design by contracts porque estou sem visão de suas possibilidades( se alguem souber, por favor me diga pois eu o achei limitado ).

Mas é isto ai, o Documento da Microsoft ajuda um pouco, faz citaçoes baseados aos livros do Eric Evans e o PoEAA do Fowler.

Valew pessoal, se tiveram algo a dizer, é so dizer!

Henrique Jacob

unread,
Mar 16, 2013, 4:41:37 PM3/16/13
to dotnetar...@googlegroups.com
Eu utilizo o Fluent Validation (http://fluentvalidation.codeplex.com/

é assim que eu uso!

internal bool ValidarUsuario(IUsuario usuario)
        {
            var validador = IoC.Resolve<IValidator, UsuarioCadastroInicialValidator>();
            var resultado = validador.Validate(usuario);
            
            if (resultado.IsValid) return true;
            MessageContainer.Instance.AddError(resultado.Errors, true);
            return false;

Alexsandro

unread,
Mar 17, 2013, 3:17:36 PM3/17/13
to dotnetar...@googlegroups.com
Ola @Henrique, pelo visto tem uma classe so pra validação de entidade ne?

Voce ta usando DDD?

Henrique Jacob

unread,
Mar 17, 2013, 6:25:15 PM3/17/13
to dotnetar...@googlegroups.com
Alexsandro,

  Não sou purista....  DDD na veia é NA MINHA OPINIÃO, muito trabalhoso... utilizo sim algumas das técnicas do DDD e de outras arquitetura/projetos que já passei... Não digo que é a melhor, mas me atende muito bem!

  Sim tenho, classes específicas de validação e elas retornam para um container de "mensagens" que podem retornar para o usuário ou apenas fazer log de uma BusinessException que eu implementei!


Em sexta-feira, 15 de março de 2013 01h40min11s UTC-3, Alexsandro escreveu:

Alexsandro

unread,
Mar 17, 2013, 7:31:42 PM3/17/13
to dotnetar...@googlegroups.com
Saquei @henrique, valeu pelas dicas!! ;)

Estou quase decidindo fazer validação na classe de entidade mesmo apensar nao concordar muito disto ser papel dela.

Eu nao sei ainda se posso fazer um serviço de dominio para receber um validador e uma entidade pra validar... mas enquanto isto vou validar nela propria.

edmilson hora

unread,
Mar 18, 2013, 7:57:12 AM3/18/13
to dotnetar...@googlegroups.com
@Alessandro, existem várias abordagens, cada uma vai ter sua particularidade, IMHO faz todo sentido que as classe de dominio saibam se validar. Afinal uma das regras base da OOP estará sendo mantida, dados+comportamento juntos no mesmo objeto. 

[]´s
Edmilson

Enviadas: Domingo, 17 de Março de 2013 20:31
Assunto: [dotnetarchitects] Re: Validation Application Block, Data Annotation ou Code Contracts?

Antonio Pedro

unread,
Mar 18, 2013, 9:35:32 AM3/18/13
to dotnetar...@googlegroups.com
Talvez isso te ajude a mudar de opinião:

Att,

Antonio Nascimento


Date: Sun, 17 Mar 2013 16:31:42 -0700
From: bagu...@gmail.com
To: dotnetar...@googlegroups.com
Subject: [dotnetarchitects] Re: Validation Application Block, Data Annotation ou Code Contracts?

Fernando Mondo

unread,
Mar 18, 2013, 8:55:48 PM3/18/13
to dotnetar...@googlegroups.com
Code Contracts não se dá bem com Entity Framework, então em meu último projeto estou usando só dataannotation mesmo, porém é sempre bom deixar suas entidades o mais ricas possíveis, com construtores e métodos que representam o domínio.

 

Alexsandro

unread,
Mar 19, 2013, 1:06:10 PM3/19/13
to dotnetar...@googlegroups.com
E será que alguem usa Code Contracts pra alguma coisa?

Daniel Porfirio

unread,
Mar 28, 2013, 10:16:54 PM3/28/13
to dotnetar...@googlegroups.com
Antes tarde do que nunca...

@Alexandre, Code Contracts e Validation Application Block são coisas distintas...

Validation Application Block, valida objetos (muita vezes oriundos de inputs de usuario) em tempo de execução.

Code Contracts, valida o contrato do objeto... uma interface convencional é um contrato que define assinaturas, quando usamos code contracts, podemos validar a consistência dos parâmetros e até mesmo o retorno dessa interface e isso e validado em tempo de build.

Fui simplista, mas acho que me fiz entender... qualquer coisa é só da um puxão de orelha que eu volto...

--
Att,

Daniel Porfirio

Alexsandro

unread,
Mar 29, 2013, 11:17:26 AM3/29/13
to dotnetar...@googlegroups.com
Bacana @Daniel,

Este seria seu exemplo dito com o Code Contracts? Não ne... neste exemplo nem tem interface rs...

    [Table("Estados")]
    public class Estado : Entity
    {
        [Required]
        public string Nome { get; set; }

        [Required]
        public string Uf { get; set; }

        /// <summary>
        ///
        /// </summary>
        /// <param name="nome">Nome do estado</param>
        /// <param name="uf">Sigla</param>
        public Estado(string nome, string uf)
        {
            Contract.Requires(!string.IsNullOrWhiteSpace(nome));
            Contract.Requires(!string.IsNullOrWhiteSpace(uf));
            this.Nome = nome;
            this.Uf = uf;
Reply all
Reply to author
Forward
0 new messages