Temple Coding

  • Home
  • Open Source
  • About
    • Books I am reading
    • About
RSS
Tag Archives: automapper

Mapeamentos condicionais usando o AutoMapper

Posted on 28/10/2010 by vintem
No Comments

Eu me deparei com um problema diferente usando o AutoMapper. Eu precisava mapear um atributo do tipo DateTime de um web service para uma classe de negócio.

Se você já fez isso, provavelmente sabe que quando tem um atributo do tipo DateTime, você terá na sua classe de proxy dois atributos. Um do tipo DateTime e um booleano que informa se o seu DateTime está preenchido ou não.

Assim, supondo que no seu web service exista um atributo do tipo DateTime chamado CriadoEm, então você terá em sua classe de proxy dois atributos assim:

?View Code CSHARP
1
2
public DateTime CriadoEm { get; set; }
public bool CriadoEmSpecified { get; set; }

Bom, nesse caso, eu queria que o AutoMapper mapeasse esse atributo apenas se CriadoEmSpecified fosse = true.

Eu resolvi isso dessa forma:

?View Code CSHARP
1
2
3
4
5
Mapper.CreateMap<ClasseOrigemWs, MinhaClasseNeg>()
  .ForMember(c => c.CriadoEm, opt => {
    opt.Condition(x => x.CriadoEmSpecified);
    opt.MapFrom(x => x.CriadoEm);
  });

É claro que isso vale para qualquer condição que você queira, então, agora é só aproveitar. Alegre

Tweet
government,politics news,politics news,politics
Categories: Development | Tags: automapper

Mapeando suas classes com o AutoMapper

Posted on 29/09/2010 by vintem
1 Comment

Um framework que eu tenho usado com frequência ultimamente é o AutoMapper, e pra quem não conhece ele, bom, ele faz.. mapeamento de objetos. Iupi!

Existem vários cenários onde isso é feito, no meu caso, principalmente, eu tenho usado para mapear estruturas de web services que eu consumo para objetos dentro da minha aplicação. Mas outro cenário comum é, quando usamos o padrão ViewModel, mapear objetos de negócio para a ViewModel.

A motivação para o uso do AutoMapper é manter as responsabilidades separadas, assim, temos um framework só para fazer isso e não precisamos colocar esse mapeamento no meio das nossas classes.

O uso do AutoMapper é bem simples, apenas um assembly que deve ser referenciado no projeto, depois disso devemos criar/definir os mapeamentos.

Vamos imaginar um cenário onde eu tenho um Web Service e quero mapear uma classe PedidoWs para a minha classe Pedido e para manter simples, digamos que as propriedades tem os mesmos nomes. Veja o diagrama abaixo:

Classes

Para fazer um mapeamento num cenário desses é bem simples, criamos o mapeamento assim:

?View Code CSHARP
1
Mapper.CreateMap<PedidoWs, Pedido>();

E depois para usarmos o mapeamento basta executar:

?View Code CSHARP
1
Mapper.Map<PedidoWs, Pedido>(meuObjetoDoTipoPedidoWs);

Esse é o padrão que vamos usar para mapear todos os objetos independentemente de como o mapeamento for criado.

Agora imagine que existam propriedades iguais, mas com nomes diferentes. Por exemplo, imagine que no PedidoWs existe uma propriedade chamada Cliente_ID ao invés de ClienteId, o mapeamento ficaria assim:

?View Code CSHARP
1
2
Mapper.CreateMap<PedidoWs, Pedido>()
     .ForMember(c => c.ClienteId, opt => opt.MapFrom(x => x.Cliente_ID));

Veja, todos os outros atributos serão mapeados normalmente, apenas o ClienteId que foi declarado de forma explícita de onde vem.

Um outro caso importante é quando temos que fazer alguma conversão. Por exemplo, digamos que no nosso caso a data vem do web service em formato de string e temos que converter para DateTime. Faríamos assim:

?View Code CSHARP
1
2
3
Mapper.CreateMap<PedidoWs, Pedido>()
     .ForMember(c => c.DataPedido, opt => opt.ResolveUsing<DateTimeResolver>()
         .FromMember(x => x.DataPedido);

Para usar o ResolveUsing precisamos definir a classe DateTimeResover e eu fiz dessa forma:

?View Code CSHARP
1
2
3
4
5
6
7
public class DateTimeResolver : ValueResolver<string, DateTime>
{
    protected override DateTime ResolveCore(string source)
    {
        return DateTime.Parse(source);
    }
}

Para finalizar, vale dizer que essa configuração dos mapeamentos pode ser demorada, então não é uma boa idéia executar as configurações toda a vez. O que eu faço, já que uso isso para a web a maior parte do tempo, é no meu Application_Start dentro do global.asax, executar essas configurações, assim elas são feitas apenas uma vez.

Existem várias outras opções de configuração para o AutoMapper e no site deles tem vários exemplos, vale a pena conferir. Aqui, foi só pra dar um gostinho.

Tweet
government,politics news,politics news,politics
Categories: Development | Tags: automapper
  • Categories

    • .NET (1)
    • ASP.NET (1)
    • ASPNET MVC (15)
    • Blog (1)
    • Source Code Control (2)
    • Development (10)
    • Java (1)
    • JavaScript (2)
    • jQuery (1)
    • Reading (5)
    • Ruby (2)
    • Ruby on Rails (1)
    • Sem categoria (23)
    • Testing (4)
  • Language

    • English
    • Português
  • Tags

    agilidade asp.net asp.net mvc asp.net vc automapper blog code templates controle de versoes css dataaccess dependency injection ebook encoding eventos excecoes firebug git globalizacao hibernate iis ironruby jasypt java javascript jquery json leitura less mvccontrib qcon rails ruby selenium simpledata snippet stored procedures structuremap tdc templates testes testes integrados visualstudio vraptor windsor
© Temple Coding. Proudly Powered by WordPress | Nest Theme by YChong