2010-10-05 11 views
5

W projekcie, nad którym pracuję, mapujemy automatycznie wygenerowane DTO do obiektów biznesowych. Baza danych ma nietypową (ale w dużej mierze spójną) konwencję nazewnictwa, co oznacza, że ​​możliwe jest przekształcenie większości nazw właściwości DTO na odpowiadające im nazwy właściwości obiektów biznesowych, co pozwala zapisać wiele linii kodu.Jak ustawić AutoMappera w radzeniu sobie z niestandardową konwencją nazewnictwa?

Na przykład w DTO (i bazie danych) mamy właściwość o nazwie account_ID__created, która będzie mapować do właściwości BO o nazwie CreatedAccountId. Jest to rodzaj transformacji, która dzieje się w MemberNameTransformer.GetBoMemberName(), więc nie jest tak prosta, jak nieco inna konwencja z innym separatorem.

Po co mam dostępne w kodzie źródłowym AutoMapper, mam to jako mój najlepszy przypuszczenie:

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(); } 
    } 
} 

Teraz, jak mam powiedzieć odwzorowującego korzystać z tych opcji podczas mapowania SomeDto do SomeBusinessClass? Zdaję sobie sprawę, że mogę mieć niewłaściwy interfejs w IMappingOptions. Prawdziwym mięsem tego, co próbuję osiągnąć, jest MemeberNameTransformer.GetBoMemberName().

Extra kredyt: Jak mogę powiedzieć odwzorowującego korzystać z tych opcji podczas mapowania dowolny IDto do IBusinessObject?

Odpowiedz

6

Jeśli wszystko jest naprawdę spójne, np. TextFirstName, możesz użyć wbudowanych funkcji.

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

W przeciwnym razie trzeba będzie napisać własny INamingConvention klasy, który wygląda mniej więcej tak ..

class DTONaming : INamingConvention 
{ 

    #region INamingConvention Members 

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

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

    #endregion 
} 

Następnie można zarejestrować, że z automapper.

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

I AutoMapper użyje tego dla jakichkolwiek przekształceń, więc jeśli trzeba ograniczyć rejestrację tych przedrostków lub obiektów zwyczaj nazywania może trzeba zainicjować i ponownie zainicjować lub coś. Wątpię, żeby schemat nazewnictwa miał konsekwencje.

Edit

Swoimi ostatnimi dodatkami będzie używana do SourceMemberNameTransformer zamiast. Pozwala to na napisanie funkcji, która przekształca nazwy samemu.

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

Nie sądzę, że to zadziała, jeśli potrzebuję. Zaktualizowałem to pytanie, aby odzwierciedlić, czym dokładnie jest konwencja nazewnictwa, z którą pracuję. Naprawdę potrzebuję mojego Func , aby powiedzieć, który element docelowy pochodzi od elementu źródłowego. –

+0

@Josh Kodroff sprawdź zaktualizowaną odpowiedź, myślę, że będzie to, czego potrzebujesz. – Jab

+0

To wszystko! Po prostu nie mogłem dowiedzieć się, gdzie ustawić SourceMemberNameTransformer. Teraz używam programu Mapper w wielu warstwach (DTO, BO, VM), więc nie chcę używać tego transformatora uniwersalnie. Jakieś pomysły, jak się upewnić, że tak się nie dzieje? –

Powiązane problemy