none
Dúvida na utilização do EF RRS feed

  • Pergunta

  • Estou montando uma arquitetura em Camadas (DAL, BLL, View, DTO) para um sistema aqui da empresa, a minha DTO são Classes POCO, para acesso a dados utilizo EF em modo Code First, para formatações e conversões dos campos tenho uma classe de Extension methods

    Estou com a seguinte dúvida, na minha camada de negócios eu preciso pegar um atributo de uma classe POCO, por exemplo Salario do tipo decimal e formatar esse atributo utilizando a classe de extension methods que já tenho desenvolvida, e na view atribuir em um campo de texto ou gridview.

    public class DTO
        {
            public decimal Salario { get; set; }
        }
    
        public class BLL
        {
            public List<DTO> GetDados()
            {
                DAL dal = new DAL();
                List<DTO> itens = dal.GetDados();
    
                foreach (var item in itens)
                {
                    // Quem vai receber salário formatado na camada DTO?
                    item.Salario.ToMoney();
                }
    
                return itens;
            }        
        }
    
        public class DAL
        {
            public List<DTO> GetDados()
            {
                return new List<DTO>();
            }
        }

    segunda-feira, 25 de junho de 2012 11:44

Respostas

Todas as Respostas

  • Olá Pedro,
    Tudo beleza?

    Percebi que sua dúvida é interessante, mas tem um problema conceitual. Na verdade quem deve ser o reponsável por determinar a formatação de valores decimais é a sua camada de apresentação e não a camada de negócio.

    O correto, seria a sua camada de apresentação fazer a formatação, justamente na hora que vc faz o binding (ou popula) o seu TextBox, DataGridView, GridView...

    No caso, o que esse Extension Method faz?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    segunda-feira, 25 de junho de 2012 22:31
    Moderador
  • Minha ideia era centralizar as formatações e conversões em uma camada abaixo da view. Não posso inventa muito também, tenho que deixa simples essa arquitetura para todos da empresa compreenderem, andei fazendo umas pesquisa e achei o DataAnnotation, consigo com ele colocar si o campo é obrigatório ou não,  tem o DisplayFormat, ainda não implementei nada com DisplayFormat, isso tudo iria para a camada de DTO. Não sei si isso é uma boa arquitetura por eu direcionar algumas regras de negocio para a DTO, alguma sugestão?

    minha classe de extension Methods

    public static class Formatar
        {        
            public static string ToMoney(this decimal valor, int quantideDeCasasDecimais = 2)
            {                        
                return valor.ToString("C" + quantideDeCasasDecimais + "", CultureInfo.CurrentCulture);
            }
    
    //Outros métodos ...
        }

    terça-feira, 26 de junho de 2012 16:10
  • Olá Pedro,
    Tudo beleza?

    No caso eu prefiro usar Fluent API ao invés de DataAnnotations, pois assim meu DTO fica totalmente desconectado de qualquer possível framework. Assim eu posso mudar a tecnologia de acesso a dados de forma transparente, sem grandes impactos na aplicação.

    No caso, seu extension method esta retornando uma string para um campo decimal, não gosto mto desta idéia, pois os usuários que tiverem de executar algum cálculo sobre o salário terão de fazer o CAST sobre essa propriedade...

    Quando encaro esse tipo de desafio, construir um framework ou um serviço, procuro retornar os dados na sua forma mais pura, sem formatação mesmo... Pq na verdade nós as vezes pensamos em criar uma facilidade para o usuário que irá consumir nosso framework e só criamos na verdade um problema.

    Se fosse vc, desencanaria da idéia de retornar os dados formatados, e deixaria essa formatação como responsabilidade do usuário final...

    Mesmo pq, a camada responsável por apresentar os dados e formatá-los é a camada de visão, não a sua camada de controle.

    []s! 


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 26 de junho de 2012 16:32
    Moderador
  • Tudo certo Fernando, 

    Não conheço Fluent API, achei uma explicação bacana nesse site -> http://blog.raffaeu.com/archive/2010/06/26/how-to-write-fluent-interface-with-c-and-lambda.aspx

    Pelo que notei é uma forma de criar uma nova instancia da classe de forma diferente da convencional.

    Nesse caso em que ponto seria interessante eu trabalhar com Fluent API?

    terça-feira, 26 de junho de 2012 19:28
  • Olá Pedro,

    Na verdade a Fluent API é um recurso do Entity Framework Code First que permite o mapeamento das suas classes sem que se utilize Data Annotations, sem que suas classes fiquem dependentes de um framework, ou de qualquer notação.

    Veja: http://ferhenriquef.com/2012/03/12/entitytypeconfiguration/

    Aqui tem dois exemplos de aplicações multi-camadas com Entity Framework Code First utilizando Fluent API, talvez ajude.

    http://ferhenriquef.com/2011/11/26/construindo-sua-camada-de-acesso-a-dados-com-o-entity-framework-4-1/

    http://ferhenriquef.com/2011/10/25/entity-framework-4-1-mvc-dao/

    E com relação a formatação dos dados? Pensou sobre o assunto?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 26 de junho de 2012 19:41
    Moderador
  • Esse mapeamento eu já tenho feito, as formatações irei fazer na View, tirar essa responsabilidade da Camada de negócio

    As validações dos campos eu faço na camada de negócio de forma simples? ou da pra implementar algo que otimize esse processo?

    Validação na BLL:

    if (string.IsNullOrEmpty(categoria.CategoryName))
        throw new ArgumentException("O Campos Nome é Obrigatório");

    Mapeamento:

    public class CategoryMap : EntityTypeConfiguration<Category>
        {
            public CategoryMap()
            {
                // Primary Key
                this.HasKey(t => t.CategoryID);
    
                // Properties
                this.Property(t => t.CategoryName)
                    .IsRequired()
                    .HasMaxLength(15);
    
                // Table & Column Mappings
                this.ToTable("Categories");
                this.Property(t => t.CategoryID).HasColumnName("CategoryID");
                this.Property(t => t.CategoryName).HasColumnName("CategoryName");
                this.Property(t => t.Description).HasColumnName("Description");
                this.Property(t => t.Picture).HasColumnName("Picture");
            }
        }
    terça-feira, 26 de junho de 2012 20:04
  • Olá Pedro,

    Vc pode fazer as validações dessa forma simples mesmo, o que esta perfeito!

    Mas, se quiser, existe um framework de validações chamada Validation Application Block, seguem alguns links:
    http://msdn.microsoft.com/en-us/library/ff648831.aspx

    http://www.codeproject.com/Articles/256355/Microsoft-Enterprise-Library-5-0-Introduction-to-V

    http://msdn.microsoft.com/en-us/library/ff650484.aspx

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    • Marcado como Resposta Pedro Ogm terça-feira, 26 de junho de 2012 20:28
    terça-feira, 26 de junho de 2012 20:10
    Moderador
  • Valeu pela ajuda Fernando vo da uma olhada em Validation Application Block
    terça-feira, 26 de junho de 2012 20:22