Robię sobię apkę, która ma taką funkcję jak tagi. Każdy tag ma swój unikalny slug używany w URLach, np. sea-animals
i tłumaczenia "pl" - "Zwierzęta morskie", "en" - "Sea animals" itd..
Encja Tag
wygląda tak:
public class Tag : BaseEntity
{
public string Slug { get; set; }
public List<TagTranslation> Translations { get; set; }
}
public class TagTranslation
{
public Tag Tag { get; set; }
public string LanguageCode { get; set; }
public string Text { get; set; }
}
Chcę to zmapować na TagDto
i zwrócić tłumaczenie w odpowiednim języku na podstawie parametru languageCode
.
Używam EF i Automappera i rozwiązanie które znalazłem do przekazania parametru w metodzie ProjectTo wydaje mi się mega dziwne. Otóż wygląda tak:
public class TagDto
{
public string Slug { get; set; }
public string Translation { get; set; }
}
// languageCode comes from request/user settings or somewhere else
var tag = await _context
.Tags
.ProjectTo<TagDto>(_mapper.ConfigurationProvider, new { lang = languageCode })
.FirstOrDefaultAsync(p => p.Slug == request.Slug);
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
//...
string lang = null;
CreateMap<Tag, TagDto>()
.ForMember(dto => dto.Translation, opt => opt.MapFrom((src) =>
src.Translations.Where(t => t.LanguageCode == lang).Select(t => t.Text).FirstOrDefault()
));
}
}
Nie wiem jak to działa, ale wstawiając lang=null
przed CreateMap w jakiś sposób ten lang
jest przekazany z metody ProjectTo
. Rozwiązanie wzięte stąd: https://stackoverflow.com/a/63632801/10254338
Zastanawiam się czy podejście które stosuje jest złe w którymś miejscu? Czy potrzeba przekazywania parametru do mappera to sygnał, że coś jest nie tak z architekturą? Może podejście do obsługi wielojęzyczności mogłoby być lepsze?