2010-10-05 6 views
5

Nel progetto a cui sto lavorando, stiamo mappando gli DTO generati automaticamente agli oggetti di business. Il database ha una ahem convenzione di denominazione insolita (ma ampiamente coerente), il che significa che è possibile trasformare la maggior parte dei nomi di proprietà DTO in nomi di proprietà di oggetti business equivalenti, risparmiando così molte righe di codice.Come posso ottenere AutoMapper per gestire una convenzione di denominazione personalizzata?

Ad esempio, nel DTO (e nel database) abbiamo una proprietà denominata account_ID__created che verrà associata a una proprietà BO denominata CreatedAccountId. Questo è il tipo di trasformazione che avviene in MemberNameTransformer.GetBoMemberName(), quindi non è così semplice come una convenzione leggermente diversa con un separatore diverso.

Dopo quello che ho a disposizione nel codice sorgente automapper, ho questo come la mia ipotesi migliore:

public class DtoBoMappingOptions : IMappingOptions 
{ 
    public INamingConvention SourceMemberNamingConvention 
    { 
     get { return new PascalCaseNamingConvention(); } 
     set { throw new NotImplementedException(); } 
    } 

    public INamingConvention DestinationMemberNamingConvention 
    { 
     get { return new PascalCaseNamingConvention(); } 
     set { throw new NotImplementedException(); } 
    } 

    public Func<string, string> SourceMemberNameTransformer 
    { 
     get { return s => s; } 
     set { throw new NotImplementedException(); } 
    } 

    public Func<string, string> DestinationMemberNameTransformer 
    { 
     get { return MemberNameTransformer.GetBoMemberName; } 
     set { throw new NotImplementedException(); } 
    } 
} 

Ora, come faccio a dire il Mapper per utilizzare queste opzioni quando mappatura SomeDto a SomeBusinessClass? Mi rendo conto che potrei avere l'interfaccia sbagliata in IMappingOptions. La vera carne di quello che sto cercando di realizzare è in MemeberNameTransformer.GetBoMemberName().

credito supplementare: Come faccio a dire il Mapper per utilizzare queste opzioni quando mappatura qualsiasi IDto a IBusinessObject?

risposta

6

Se le cose sono veramente coerenti, come textFirstName, è possibile utilizzare alcune funzioni incorporate.

Mapper.Initialize(cfg => cfg.RecognizePrefixes(new[] { "text" })); 

In caso contrario, sarà necessario scrivere il proprio INamingConvention classe che sembra qualcosa di simile ..

class DTONaming : INamingConvention 
{ 

    #region INamingConvention Members 

    public string SeparatorCharacter 
    { 
     get { return string.Empty; } 
    } 

    public Regex SplittingExpression 
    { 
     get { return new Regex(""); } 
    } 

    #endregion 
} 

Quindi è possibile registrare che con automapper.

Mapper.Initialize(cfg => cfg.SourceMemberNamingConvention = new DTONaming()); 

E automapper useranno questo per qualsiasi mapping, quindi se avete bisogno di limitare la registrazione di questi prefissi o oggetti di denominazione personalizzata che potrebbe essere necessario inizializzare e reinizializzare o qualcosa. Dubito che lo schema di denominazione avrebbe delle conseguenze.

Modifica

Con le recenti aggiunte si prevede di utilizzare un SourceMemberNameTransformer invece. Questo ti permette di scrivere una funzione che converte i nomi tu stesso.

Mapper.Initialize(cfg => cfg.SourceMemberNameTransformer = ConvertNames); 
private static string ConvertNames(string inputString) 
{ 
    var sections = inputString.Split('_'); 
    // transform the sections into w/e you need 
    return inputString; 
} 
+0

Non penso che funzionerà per quello che mi serve. Ho aggiornato la domanda per riflettere su quale sia esattamente la convenzione di denominazione con cui sto lavorando. Ho davvero bisogno del mio Func per dire quale membro di destinazione proviene da quale membro sorgente. –

+0

@Josh Kodroff controlla la risposta aggiornata, penso che sarà quello che ti serve. – Jab

+0

Ecco fatto! Non riuscivo a capire dove impostare SourceMemberNameTransformer. Ora, sto usando il Mapper in più livelli (DTO, BO, VM), quindi non voglio usare quel trasformatore universalmente. Qualche idea su come assicurarsi che ciò non accada? –

Problemi correlati