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?
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. –
@Josh Kodroff sprawdź zaktualizowaną odpowiedź, myślę, że będzie to, czego potrzebujesz. – Jab
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? –