2016-05-20 8 views
3

Ich bin neu von ASP.NET BoilerPlate (ABP) und ich versuche zu verstehen, wie benutzerdefinierte Zuordnungen mithilfe von AutoMapper und möglicherweise die ABP-Auto-Attribute erstellt: AutoMap, AutoMapFrom, AutoMapTo .Benutzerdefinierte Zuordnung mit asp.net boilerplate und Automapper

Mit ABP kann ich zwei Klassen auf diese Weise Karte:

[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; } 
} 

Aber wenn ich zwei Klassen wie folgt aus, wo ich möchte, dass die Eigenschaft AB als Join von A und B mit Automap werden:

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

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

Gibt es einige Attribute mit ABP? Oder muss ich den „klassischen“ AutoMapper Code verwenden:

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

Und wo ich so init-Code zu platzieren haben?

Antwort

2

Ich habe eine Lösung gefunden, die ich hier teile.

  1. In "MyProject.Application" Projekt definierte ich meinen AutoMapper Zoll (I verwendeten Profile):
 
    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. Dann registrierte ich es für die Injektion in dem initialisieren Methode der Klasse MyProjectApplicationModule:
 
    [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 
     } 
    } 

Bitte beachte, dass ich direkt das Schloss IOC Registe verwendet r Methoden, weil ich keine nützliche Registrierungsmethode für Objekte in ABP gefunden habe. Kennst du einen?

  1. Schließlich habe ich meine benutzerdefinierte Zuordnung als Injektion in meinem Application Service und verwenden es direkt:
 
    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

Keine Notwendigkeit, auf dem Modul aller Kundenzuordnung zur Liste . Sagen Sie dem Modul, dass es alle Klassen finden soll, die AutoMapper erweitern. Profil:

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