Não importa, desde que seja uma classe estática. É tudo sobre convenções .
Nossa convenção é que cada "camada" (web, serviços, dados) possui um único arquivo chamado AutoMapperXConfiguration.cs
, com um único método chamado Configure()
, onde X
está a camada.
O Configure()
método chama private
métodos para cada área.
Aqui está um exemplo de nossa configuração de camada da web:
public static class AutoMapperWebConfiguration
{
public static void Configure()
{
ConfigureUserMapping();
ConfigurePostMapping();
}
private static void ConfigureUserMapping()
{
Mapper.CreateMap<User,UserViewModel>();
}
// ... etc
}
Criamos um método para cada "agregado" (Usuário, Postagem), para que as coisas sejam bem separadas.
Então seu Global.asax
:
AutoMapperWebConfiguration.Configure();
AutoMapperServicesConfiguration.Configure();
AutoMapperDomainConfiguration.Configure();
// etc
É como uma "interface de palavras" - não pode ser aplicada, mas você espera, portanto pode codificar (e refatorar), se necessário.
EDITAR:
Apenas pensei em mencionar que agora uso perfis do AutoMapper , então o exemplo acima se torna:
public static class AutoMapperWebConfiguration
{
public static void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile(new UserProfile());
cfg.AddProfile(new PostProfile());
});
}
}
public class UserProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<User,UserViewModel>();
}
}
Muito mais limpo / mais robusto.
Mapper.Initialize
em cada classe de configuração substitui os perfis anteriores adicionados? Se sim, o que deve ser usado em vez de inicializar?Mapper.CreateMap()
agora está obsoleta.'Mapper.Map<TSource, TDestination>(TSource, TDestination)' is obsolete: 'The static API will be removed in version 5.0. Use a MapperConfiguration instance and store statically as needed. Use CreateMapper to create a mapper instance.'
. Como você atualizaria seu exemplo para estar em conformidade com os novos requisitos?Você pode realmente colocá-lo em qualquer lugar, desde que o seu projeto da Web faça referência à montagem em que está. Na sua situação, eu o colocaria na camada de serviço, pois isso será acessível pela camada da Web e pela camada de serviço e, posteriormente, se você decidir em um aplicativo de console ou em um projeto de teste de unidade, a configuração de mapeamento também estará disponível nesses projetos.
No seu Global.asax, você chamará o método que define todos os seus mapas. Ver abaixo:
Arquivo AutoMapperBootStrapper.cs
Global.asax no início do aplicativo
apenas ligue
Agora, algumas pessoas argumentam contra esse método viola alguns princípios do SOLID, com argumentos válidos. Aqui estão eles para a leitura.
Configurar o Automapper no Bootstrapper viola o princípio de aberto-fechado?
fonte
Atualização: a abordagem publicada aqui não é mais válida, pois
SelfProfiler
foi removida a partir do AutoMapper v2.Eu adotaria uma abordagem semelhante à de Thoai. Mas eu usaria a
SelfProfiler<>
classe interna para manipular os mapas e, em seguida, usaria aMapper.SelfConfigure
função para inicializar.Usando este objeto como fonte:
E estes como o destino:
Você pode criar estes perfis:
Para inicializar no seu aplicativo, crie esta classe
Adicione esta linha ao seu arquivo global.asax.cs:
AutoMapperConfiguration.Initialize()
Agora você pode colocar suas classes de mapeamento onde elas fazem sentido para você e não se preocupar com uma classe de mapeamento monolítico.
fonte
Para aqueles que seguem o seguinte:
Fiz uma combinação entre perfis e alavancando meu contêiner ioc:
Configuração IoC:
Exemplo de configuração:
Exemplo de uso:
A desvantagem é que você precisa fazer referência ao Mapper pela interface IMappingEngine em vez do Mapper estático, mas é uma convenção com a qual posso conviver.
fonte
Todas as soluções acima fornecem um método estático para chamar (de app_start ou qualquer outro local) que deve chamar outros métodos para configurar partes da configuração de mapeamento. Mas, se você tiver um aplicativo modular, esses módulos poderão se conectar e sair do aplicativo a qualquer momento, essas soluções não funcionarão. Eu sugiro usar a
WebActivator
biblioteca que pode registrar alguns métodos para executarapp_pre_start
e emapp_post_start
qualquer lugar:Você pode instalar
WebActivator
via NuGet.fonte
MyModule1
projeto (ou seja qual for o nome do seu projeto), basta criar uma classe chamadaInitMapInModule1
e colocar o código dentro do arquivo; para outros módulos, faça o mesmo.Além da melhor resposta, uma boa maneira é usar o Autofac IoC liberary para adicionar alguma automação. Com isso, você apenas define seus perfis, independentemente das iniciações.
e chamando esta linha no
Application_Start
método:O código acima localiza todas as subclasses de perfil e as inicia automaticamente.
fonte
Colocar toda a lógica de mapeamento em um local não é uma boa prática para mim. Porque a classe de mapeamento será extremamente grande e muito difícil de manter.
Eu recomendo colocar o material de mapeamento junto com a classe ViewModel no mesmo arquivo cs. Você pode navegar facilmente para a definição de mapeamento desejada após esta convenção. Além disso, ao criar a classe de mapeamento, você pode fazer referência às propriedades do ViewModel mais rapidamente, pois estão no mesmo arquivo.
Portanto, sua classe de modelo de exibição será semelhante a:
fonte
A partir da nova versão do AutoMapper, o método estático Mapper.Map () foi preterido. Portanto, você pode adicionar o MapperConfiguration como propriedade estática ao MvcApplication (Global.asax.cs) e usá-lo para criar uma instância do Mapper.
App_Start
Global.asax.cs
BaseController.cs
https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API
fonte
Para aqueles que estão (perdidos) usando:
Veja como eu consegui integrar o AutoMapper da " nova maneira ". Além disso, um enorme agradecimento a esta resposta (e pergunta)
1 - Criou uma pasta no projeto WebAPI chamada "ProfileMappers". Nesta pasta, coloco todas as minhas classes de perfis que criam meus mapeamentos:
2 - No meu App_Start, tenho um SimpleInjectorApiInitializer que configura meu contêiner SimpleInjector:
3 - Startup.cs
4 - Em seguida, no seu controlador, basta injetar como normalmente uma interface IMapper:
fonte
Para programadores do vb.net que usam a nova versão (5.x) do AutoMapper.
Global.asax.vb:
Configuração do AutoMapper:
Perfis:
Mapeamento:
fonte
Protected Overrides Sub Configure()
está obsoleto. Estadias Tudo o mesmo, mas esta linha deve ser:Public Sub New()