我有一个多语言数据库,它根据键和枚举
键来自DB对象,但我如何将当前语言传递给
目前,我使用
Language
返回值。当我将DB对象转换为模型时,我希望模型包含基于键和当前语言的翻译值。键来自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
传递数据?
AutoMapper.Mapper.Map<string, string>("value", opt => opt.Items["language"] = "english")
的第二个参数是一个 lambda 表达式,你可以传递一个方法的地址来向你的字典添加键。 - samy