Usuário com melhor resposta
Dúvida na utilização do EF

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>(); } }
Respostas
-
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.aspxhttp://www.codeproject.com/Articles/256355/Microsoft-Enterprise-Library-5-0-Introduction-to-V
http://msdn.microsoft.com/en-us/library/ff650484.aspx
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
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 -
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 ... }
-
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 -
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?
-
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/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 -
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"); } }
-
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.aspxhttp://www.codeproject.com/Articles/256355/Microsoft-Enterprise-Library-5-0-Introduction-to-V
http://msdn.microsoft.com/en-us/library/ff650484.aspx
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
-