Fórum Criando propriedade do tipo classe #3035
23/02/2009
Oi!
Eu estou com uma situação que é a seguinte. Para desenvolver fazendo uso de boas práticas, assiste uma vídeo aula que fala para fazer uso de BLL, DAL e DTO. Até ai, tudo bem, é da mesma forma que trabalho hoje em dia, exceto um detalhe. Em determinadas situações que preciso de informações de mais de um classe, onde na minha DAL possa fazer JOIN entre tabelas e tudo mais, ao retornar isso para uma BLL e consequentemente para uma interface, eu transporto os dados entre as camadas por meio de um DataReader. Pelo que entendi, isso não seria 100% OO, já que o correto seria fazer uso da DTO, pois estaria transferido o objeto.
Até consigo fazer esta última situação quando se trata das informações apenas de uma classe.
Para exemplo, digamos que eu tenho as classes Pedido e PedidoItem, ou Cliente e Cidade. Em uma delas criei a propriedades com o tipo List<classe> e na DAL populei os dados da propriedades manualmente, fazendo uso do DataReader e adicionando na lista.
O meu problema foi no retorno, pois na camada de interface eu uso um objectDataSource que está vinculado a um método da BLL para obter as informações, e vinculei este objectDataSource a um GridView. No GridView eu gostaria de mostrar 2 informações da classe principal e 1 informação da classe vinculada por meio da propriedade, mas neste último caso não consegui fazê-lo, pois o GridView não reconhece a propriedade que possui List<classe> na propriedade DataField do tipo de coluna BoundField.
Como eu poderia solucionar este problema? Eu faço uso do Visual Studio 2005, em C#. Já ouvi dizer que o LINQ no 2008 rsolve isso fácil, mas como tem alguns sistemas que ainda trabalho no 2005, seria interessante se eu soubesse de alguma forma.
E minha segunda pergunta é: Como mencionei acima, em alguns casos que preciso de informações de várias classes para exibir dados na camada de interface ou até mesmo utilizar na BLL, isso faz com que meu modelo deixe de ser OO ou esteja totalmente errado a prática que estou usando?
Obrigado pela atenção, fico no aguardo!!
Posts
24/02/2009
[devmedia .net]
Opa, blz Carlos..?
Seguinte, não há como acessar os valores das propriedades do tipo List pelo GridView,
pois o mesmo só acessa valores que ele pode "enxergar", portanto o que deve ser feito é
buscar os dados na base de dados e popular as propriedades da classe,
dentro de suas camadas, utilizar o DataReader não quer dizer que não usa OO,
a orientação a objeto está em suas classes e como manipula as mesmas e não exatamente como retorna esses dados, não é isso que deixa a aplicação errada, e não existe aplicação certa ou errada, existe a que utiliza bem o OO só isso.
Para que possa popular o GridView com os dados da propriedade list a melhor maneira é transformar o retorno em XML ou DataTable e colocar no DataSource do Grid.
Para isso terá que fazer um loop no objeto que retornou, e criar o DataTable na mão..
Fiz uma prévia do código que deverá fazer.. veja :
Classe Pedido
public class Pedido
{
public Pedido(int CodigoPedido)
{
this.CodigoPedido = CodigoPedido;
}
private int codigoPedido;
private List<ItemPedido> itemPedido;
public int CodigoPedido
{
get { return codigoPedido; }
set { codigoPedido = value; }
}
public List<ItemPedido> ItemPedido
{
get { return itemPedido; }
set { itemPedido = value; }
}
}
Classe ItemPedido
public class ItemPedido
{
public ItemPedido(int CodigoItem, string NomeItem)
{
this.CodigoItem = CodigoItem;
this.NomeItem = NomeItem;
}
private int codigoItem;
private string nomeItem;
public int CodigoItem
{
get { return codigoItem; }
set { codigoItem = value; }
}
public string NomeItem
{
get { return nomeItem; }
set { nomeItem = value; }
}
}
Responsável pela chamada dos métodos
//M‚otod que deve estar dentro da camada de acesso a dados
public void popularPedido()
{
List<Pedido> listaPedidos = new List<Pedido>();
//Estou criando apenas dois pedidos
for (int i = 0; i < 2; i++)
{
//Estou utilziando o constructor para construir o primeiro objeto pedido
listaPedidos.Add(new Pedido(i));
}
//Para cada pedido eu vou buscar os itens dos mesmos
foreach (Pedido pedido in listaPedidos)
{
//Veja que passo a classe como referencia, portanto n~ao espero retorno
//Apenas vai alterar minha classe pedido
pedido.ItemPedido = retornarItens(pedido);
}
GridView1.DataSource = listaPedidos;
GridView1.DataBind();
}
//M‚todo que deve estar dentro da camada de acesso a dados
public List<ItemPedido> retornarItens(Pedido pedido)
{
List<ItemPedido> listaItemPedido = new List<ItemPedido>();
//nesse momento voce faz a consulta na base de dados e retorna todos os itens do pedido passado
//popula objetos com os dados retornados
//Pode-se utilizar o datareader normalmente sem problemas
for (int i = 0; i < 10; i++)
{
listaItemPedido.Add(new ItemPedido(i, "Produto " + i.ToString()));
}
return listaItemPedido;
}
public void popularGridView(List<Pedido> listaPedido)
{
DataTable dt = new DataTable();
DataRow dr;
foreach (Pedido pedido in listaPedido)
{
//loop nos objetos retornados
}
}
Veja também minha aula sobre LINQ, sei que não quer utilizá-la, pode te dará uma idéia de como funciona
e poderá te ajudar a resolver seu problema:
Caso não tenha acesso a video aula por favor me retorne, pois daremos o acesso para você gratuitamente
https://www.devmedia.com.br/articles/viewcomp.asp?comp=8359
Espero ter ajudado,
aguardo seu contato
Carlos Jr
24/02/2009
Carlos Nogueira
Opa Carlos, beleza?
Nossa, só pela sua resposta já clareou bem o procedimento que estou usando por aqui, a forma de trabalhar com as camadas, desta forma fico mais aliviado, pois pensei que estive muito fora do que deveria ser feito. É que assisti uma vídeo aula de boas práticas que estava retornando o objeto mesmo (mas o exemplo foi com uma classe) mas nos sistemas que trabalho (e por ai a fora também, claro) eu trafego com várias informações de várias classes entre as camadas para alcançar o objetivo, e não estava conseguindo fazer justamente isso para exibir no GridView (popular o objeto na DAL até consegui).
Mas beleza! E quanto a vídeo aula de Linq, opa, quero assistir sim, é muito importante, mas está bloqueado, e nem sei porque, fechei a assinatura Gold com a devmedia mas não tô conseguindo assistir, tenho até que ver depois com a Devmedia se eu entendi errado quando fechei.
Ah, e pode mandar o feedback de novo que vou responder que solucionou minha dúvida, é que não tinha respondido antes para poder responder ao post anterior!
Mais uma vez muito obrigado pelo esclarecimento!
Atenciosamente,
Carlos
25/02/2009
[devmedia .net]
Oi Carlos, que legal cara que conseguiu resolver...
Muito bom...
O moderador do sistema de consultoria já foi informado sobre a liberação da video aula para você,
e assim que for liberado você será comunicado ok !?
Grande Abraço
Precisando estamos por aí...
Carlos Jr
Carlos,
o video já está liberado para acesso.
04/03/2009
Carlos Nogueira
Fui tentar acessar pelo link que o Carlos Junior deixou no post anterior, mas não consegui! Disse que está fechado para mim!
04/03/2009
Carlos Nogueira
Ah, eu gostaria de tirar mais uma dúvida que surgiu sobre este mesmo assunto.
No caso do desenvolvedor receber ou elaborar um diagrama de classes que haja uma associação entre duas classes, para representar esta associação por meio dos atributos, seria fazendo o uso do List<> citado anteriormente, certo? Mas como citei que em alguns casos faço a transferência dos dados entre as camadas por meio de um DataReader, acaba que eu desenvolvo as classes como se fosse um modelo DER, sabe? (isto é, no 2005, no 2008 me parece que existem outras formas de solucionar isto de forma mais simples, como o Linq citado aqui, como exemplo).
Por eu seguir este tipo de lógica, há algum problema na minha modelagem quanto a orientação a objetos?
Mais uma vez obrigado pela atenção!
Carlos Eduardo,
vc recebeu créditos para comprar esse post. Quando entrar novamente no mesmo, vc pode comprar o post que o mesmo será debitado do valor que colocamos pra vc. Lembrando que isso vale somente para o post recomendado pelo consultor.
05/03/2009
[devmedia .net]
Opa tudo bem ?
Se utilizar o LINQ ele vai usar o mesmo artifício,
irá gerar a classe com uma propriedade de outra classe usando List do mesmo jeito..
Caso queira usar como se faz em um DER,
você terá uma propriedade na classe principal com o mesmo tipo da chave principal da outra tabela,
portanto você deverá fazer uma pesquisa com o código informado e popular uma classe com as informações retornadas, ou trabalhar com tabela.
Abraços
Carlos Jr