2016-05-20 2 views
3

Je suis nouveau de ASP.NET BoilerPlate (ABP) et j'essaie de comprendre comment créer des mappages personnalisés en utilisant AutoMapper et, peut-être, les attributs automapper ABP: AutoMap, AutoMapFrom, AutoMapTo .Mappage personnalisé avec asp.net boilerplate et Automapper

Avec ABP Je peux mapper deux classes de cette façon:

[AutoMapTo(typeof(DestClass)] 
public class SourceClass { 
    public string A { get; set; } 
    public string B { get; set; } 
} 

public class DestClass { 
    public string A { get; set; } 
    public string B { get; set; } 
} 

Mais si j'ai deux classes comme ce qui suit où je veux la propriété AB à automapped comme une jointure de A et B:

[AutoMapTo(typeof(DestClass)] 
public class SourceClass { 
    public string A { get; set; } 
    public string B { get; set; } 
} 

public class DestClass { 
    public string AB { get; set; } 
} 

Existe-t-il des attributs avec ABP? Ou dois-je utiliser le code AutoMapper "classique":

Mapper.CreateMap<SourceClass, DestClass>() 
    .ForMember(dest => dest.AB, 
     opts => opts.MapFrom(src => (src.A + ", " + src.B))); 

Et où dois-je placer un tel code init?

Répondre

2

J'ai trouvé une solution que je partage ici.

  1. Dans projet "MyProject.Application" Je définis mes coutumes automapper (je profils):
 
    public class MyProjectAutoMapperProfile : AutoMapper.Profile { 

     protected override void Configure() { 
      CreateMap<SourceClass, DestClass>() 
       .ForMember(dest => dest.AB, 
          opts => opts.MapFrom(src => (src.A + ", " + src.B))); 
      // other customs here... 
     } 
  1. Ensuite, je me suis inscrit pour injection dans le méthode initialize de la MyProjectApplicationModule de classe:
 
    [DependsOn(typeof(MyProjectCoreModule), typeof(AbpAutoMapperModule))] 
    public class MyProjectApplicationModule : AbpModule 
    { 
     public override void Initialize() 
     { 
      IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); 

      // --- MY CODE for registering custom automapping 
      var mapperConfiguration = new MapperConfiguration(cfg => { 
       cfg.AddProfile(new MyProjectMapperProfile()); // <= here my custom mapping 
      }); 

      var mapper = mapperConfiguration.CreateMapper(); 
      IocManager.IocContainer.Register(
        Castle.MicroKernel.Registration.Component.For<IMapper>().Instance(mapper) 
       ); 
      // --- MY CODE 
     } 
    } 

Notez que je directement utilisé le château du CIO Registe Méthodes r parce que je n'ai trouvé aucune méthode d'enregistrement utile pour les objets dans ABP. En connaissez-vous un?

  1. Enfin, j'utilisé mon mappage personnalisé comme injection dans mon Application Service et utilisé directement:
 
    public class MyAppService : MyNewHouseAppServiceBase, IMyAppService { 
     // ... 

     public MyAppService(IRepository<SourceClass, long> myRepository, AutoMapper.IMapper mapper) { 
      _myRepo = myRepository; 
      _mapper = mypper; 
     } 

     public async Task<DestClass> GetSource(long id) { 
      var source = await _myRepo.Find(id); 

      // USE THE INJECTED MAPPER 
      return _mapper.Map<DestClass>(source); 
     } 

     public async Task<ListResultOutput<DestClass>> GetSources() { 
      var sources = await _myRepo.GetAllListAsync(); 

      return new ListResultOutput<DestClass>(
          // USE THE INJECTED MAPPER 
          _mapper.Map<List<DestClass>>(sources) 
         ); 
     } 
    } 
0

Pas besoin de lister tous les mapping client sur le module . Il suffit de dire au module de trouver toutes les classes qui étendent AutoMapper.Profile:

Assembly thisAssembly = typeof(AbpProjectNameApplicationModule).GetAssembly(); 
IocManager.RegisterAssemblyByConvention(thisAssembly); 
cfg.AddProfiles(thisAssembly);