Umgeben von Werten an einen AutoMapper Type Converter von außerhalb

Ich habe eine mehrsprachige Datenbank, die Werte basierend auf einem Schlüssel und einer Aufzählung zurückgibtLanguage. Wenn ich ein DB-Objekt in ein Modell konvertiere, soll das Modell den übersetzten Wert basierend auf dem Schlüssel und der aktuellen Sprache enthalten.

Der Schlüssel stammt aus dem DB-Objekt, aber wie kann ich die aktuelle Sprache an das @ übergebeMapper.Map() Funktion?

Zur Zeit benutze ich ein[ThreadStatic] -Attribut zum Festlegen der Kultur vor dem Aufrufen vonMapper.Map<>, und um es im @ abzurufTypeConverter.

public enum Language
{
    English, French, Italian, Maltese
}

public class MultilingualValue<T>
{
    public Dictionary<Language, T> Value { get; set; }
    public MultilingualValue()
    {
        this.Value = new Dictionary<Language, T>();
    }
}

public class PersonData
{
    public string FirstName { get; set; }
    public MultilingualValue<string> City { get; set; }
}

public void MapPerson()
{
    PersonData personData = new PersonData();
    personData.FirstName = "John";
    personData.City = new MultilingualValue<string>();
    personData.City.Value[ Language.English] = "The Zurrieq";
    personData.City.Value[Language.French] = "Le Zurrieque";

    MultilingualValueData.CurrentLanguage = Language.English; 

    var personModel = Mapper.Map<PersonData, PersonModel>(personData);
}

public class MultilingualValueToBasicDataTypeConverter<T> : ITypeConverter<MultilingualValue<T>, T> 
{
    public T Convert(ResolutionContext context)
    {
        var currentLanguage = MultilingualValueData.CurrentLanguage; //THIS IS THE [ThreadStatic] VARIABLE
        if (currentLanguage == null) throw new InvalidOperationException("Please make sure to fill in CurrentLanguage");

        MultilingualValue<T> sourceMultilingualValue = (MultilingualValue < T > )context.SourceValue;

        T destinationValue = default(T);
        if (sourceMultilingualValue != null)
        {
            destinationValue = sourceMultilingualValue.Value[currentLanguage.Value];
        }

        return destinationValue;
    }
}        

public static class MultilingualValueData
{
    [ThreadStatic]
    public static Language? CurrentLanguage;
}

Ich habe die Konfigurationen weggelassen, da ich denke, dass sie für dieses Beispiel nicht erforderlich sind. Wenn du sie brauchst, poste ich sie auch.

Während dies funktioniert, finde ich diese Problemumgehung ziemlich hässlich. Gibt es eine Möglichkeit, Daten über das @ zu übertrageResolutionContext?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage