从外部将值传递给AutoMapper Type Converter

时间:2014-10-14 17:25:14

标签: automapper

我有一个多语言数据库,它根据键和枚举Language返回值。当我将DB对象转换为模型时,我希望模型包含基于键和当前语言的翻译值。

密钥来自数据库对象,但如何将当前语言传递给Mapper.Map()函数?

目前,我在调用[ThreadStatic]之前使用Mapper.Map<>属性设置文化,并在TypeConverter中检索文化。

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

我遗漏了配置,因为我认为他们不需要这个例子。如果你需要它们,我也会发布它们。

虽然这有效,但我发现这种解决方法非常难看。有没有办法通过ResolutionContext传递数据?

1 个答案:

答案 0 :(得分:20)

只需使用Map的{​​{1}}重载即可。您可以将配置元素添加到Action<IMappingOperationOptions>属性,然后传递给Items

ITypeConverter