Voltar

Release: Yamapper 10.10.22.1412

Em Releases | 10/10/2010 16:10 Intentor Projects

Uma nova versão do Yamapper está disponível, contendo as seguintes implementações:

Observações

Arquivo de mapeamento

Para comportar a indicação de lazy loading e de campos de autonumeração, o arquivo de mapeamento (*.cmf) sofreu alterações e portanto está em nova versão (10.8.23.0). Assim, atentem para a atualização para o novo namespace, urn:yamapper-mapping-10.8.23.0. Abaixo segue exemplo da nova versão do arquivo (extraído do projeto de exemplo, Intentor.Examples.Web):



  
    
    
    
  

Gerador de código

O gerador de código baseado em MyGeneration Intentor.Yamapper Class Generator.csgen foi atualizado para refletir todas as melhorias realizadas.

A partir desta versão, todos os Data Access Objects (Dao), Business Objects (Biz) e Data Interfaces (Repository) gerados são criados como Partial Classes em 2 arquivos separados:

Recomenda-se atentar também para as alterações dos métodos GetById e Delete, os quais são gerados automaticamente e não mais estão presentes no objeto DbProvider.

Paginação

A partir desta versão é possível também a realização de paginação a partir da manipulação do objeto Criteria utilizando-se dos métodos Limit (quantidade máxima de registros a ser retornada) e Offset (índice do registro inicial para obtenção dos dados, começando em 0). O exemplo abaixo demonstra a utilização de tal procedimento em um método PageIndexChanging de um GridView:

protected void gvAllClientes_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
	//Obtém o GridView.
	var grv = ((GridView)sender);
	//Obtém o tamanho da página para paginação.
	int pageSize = grv.PageSize;

	//Cria o critério de paginação utilizando-se de OffSet e Limit.
	var crit = Criteria.Create()
		.Offset(e.NewPageIndex * pageSize) //Posição inicial.
		.Limit(pageSize); //Quantidade máxima de registros a ser obtida.

	//Popula o GridView.
	grv.PageIndex = e.NewPageIndex;
	grv.DataSource = Facade.GetByCriteria(crit);
	grv.DataBind();
}

Expressões

Novas expressões foram criadas para tornar mais prática a filtragem de dados diretamente a partir do objeto Criteria. Foram inseridas expressões com IN, NOT IN e instruções SQL, além de agrupamento e aninhamento de expressões com AND e OR.

O uso de IN e NOT IN implica no envio de um Array como parâmetro. Tal Array deverá ser do tipo definido pelo parâmetro genérico T. No exemplo abaixo, são retornados todos as pessoas de nomes "Astrobaldo", "Bráulio" ou "Josisbaldo":

provider.GetByCriteria(Criteria.Create()
	.Add(Expression.In<string>("Nome"
		, new string[] { "Astrobaldo", "Bráulio", "Josisbaldo" })));

O uso de expressões com instruções SQL permite um maior controle sobre a obtenção dos dados sem dispensar as facilidades do objeto Criteria. Com esta expressão, pode-se acrescer instruções SQL que serão anexadas à parte WHERE da instrução, auxiliando na elaboração de filtros complexos. Sua utilização pode ser feita com ou sem parâmetro. Caso haja parâmetro, a palavra reservada {param} deverá ser utilizada para indicar o local no qual deverá ser substituído o nome interno do parâmetro gerado. No exemplo abaixo, são retornados todas as pessoas que possuam nomes com a letra J:

provider.GetByCriteria(Criteria.Create()
	.Add(Expression.Sql("Nome LIKE {param}", "%J%")));

O aninhamento de expressões a partir de operadores lógicos permite vastas possibilidades de criação de critérios de obtenção de registros. Para tal, basta utilizar-se dos métodos Expression.And ou Expression.Or, de acordo com o operador lógico desejado, para criar e aninhar expressões. A quantidade de expressões que pode ser aninhada é ilimitada. No exemplo abaixo, expressões AND são aninhadas em uma expressão OR para obtenção de registros de pessoas com determinados nomes e configurações de data:

provider.GetByCriteria(Criteria.Create()
	.Add(Expression.Or(
		Expression.And(
			Expression.Equal("Nome", "Astrobaldo"),
			Expression.IsNull("DataCadastro"))
		, Expression.And(
			Expression.Equal("Nome", "Bráulio"),
			Expression.IsNotNull("DataCadastro"))
		, Expression.And(
			Expression.Equal("Nome", "Josisbaldo"),
			Expression.GreaterThan("DataCadastro", DateTime.Now.AddYears(-2)))
		)
	)
);

Lazy loading

Lazy loading permite o carregamento de campos das classes de entidades por demanda, preenchendo as propriedades apenas quando de sua utilização. Tal procedimento torna mais ágil a obtenção de dados e permite que, em entidades com dezenas de campos, apenas os campos que são efetivamente utilizados sejam preenchidos.

Para utilizar esta funcionalidade, basta preencher a propriedade lazyLoading do arquivo de mapeamento da entidade como true (por padrão, tal valor é false).

No entanto, deve-se atentar para o uso de entidades que estejam com lazy loading habilitado em componentes do .Net que suportem DataBinding, como o GridView e o Repeater. Em tais componentes, poderá ocorrer a exceção Object does not match target type durante o preenchimento dos dados.

Para contornar esse problema, um método de extensão em objetos List chamado BindTo permite a cópia dos dados da entidade com lazy loading habilitado para outro objeto que contenha propriedades de mesmo nome ou mesmo para objetos da mesma entidade. A única restrição deste método é que as propriedades do objeto que receberá os dados deverão ter os mesmos nomes das propriedades da entidade, porém não necessariamente refletindo a entidade como um todo, podendo conter apenas algumas de suas propriedades.

O código abaixo exemplifica o uso do método BindTo em uma lista contendo pessoas, a qual é convertida de uma lista de objetos Pessoas para uma lista de objetos PessoasView, contornando a exceção Object does not match target type:

this.gvPessoas.DataSource = 
	Facade.GetPessoas().BindTo<PessoasView, Pessoas>();
this.gvPessoas.DataBind();

Ao infinito e além

O projeto de exemplo presente no código-fonte do Yamapper apresenta todos esses conceitos de forma prática.

Caso tenha alguma dúvida, curiosidade, trauma ou angústia sobre o projeto, ou apenas deseja elogiá-lo, utilize o espaço de comentários mais abaixo para entrar em contato.

Comentários
Comentar
Campos marcados com * são obrigatórios. Seu e-mail não será exibido.
*
*
*
Captcha *
CATEGORIAS AO TOPO E ALÉM LUGARES PARA IR
Topo

“Holy Grail of legibility [in programming]: self-documenting code.” - Steve McConnell