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?
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. –
@Josh Kodroff controlla la risposta aggiornata, penso che sarà quello che ti serve. – Jab
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? –