2017-12-08 9 views
3

リストから完全に異なる名前にマッピングできるマッピング設定を持つ方法を見つけようとしています。異なる言語のオブジェクトをオートマップする

私たちのデータベースはオランダ語であり、スキャフォールディングツール(scaffold-dbcontextなど)はDTOのテーブル名を保持します。 db関連のレイヤーの外では、英語の名詞を好むでしょう。

Department department = Mapper.Map<Afdeling, Department>(afdeling); 

は私が次の単語マッピング

Afdeling Department 
Kode  Code 
Werkenemers Employees 
Persoon  Person 

のようなマッピングできるようにAutoMapperを設定することがことが可能である知って考えると

Afdeling 
    Id: int 
    TypeKode: string 
    Werkenemers: Persoon[] 

Department 
    Id: int 
    TypeCode: string 
    Employees: Person[] 

を以下していると言います

+0

あなたが何を意味するかは非常に明確ではありません。これらのクラスの_properties_を自動的にマップしたいのですが、これらのプロパティの言語が異なるとしますか? – Evk

+0

私の例では展開されています。それは今より意味があるのですか? –

答えて

3

はい、できます。ここにコードサンプルがありますが、ちょうどサンプルです。それは一般的なアプローチを示していますが、完全ではなく、不要なものがいくつか含まれていますので、何が起こっているのかを必ず確認してください。

まず、カスタムマッパー:

class DictionaryMapper : ISourceToDestinationNameMapper { 
    public Dictionary<string, string> Map { get; set; } 
    public MemberInfo GetMatchingMemberInfo(IGetTypeInfoMembers getTypeInfoMembers, TypeDetails typeInfo, Type destType, Type destMemberType, string nameToSearch) { 
     if (Map == null || !Map.ContainsKey(nameToSearch)) 
      return null; 
     // map properties using Map dictionary 
     return typeInfo.DestinationMemberNames 
      .Where(c => c.Member.Name == Map[nameToSearch]) 
      .Select(c => c.Member) 
      .FirstOrDefault(); 
    } 
} 

その後

var langMappings = new Dictionary<string, string>(); 
// note that it's better to use two dictionaries - one for type names 
// and another for properties 
langMappings.Add("Afdeling", "Department");    
langMappings.Add("TypeKode", "TypeCode");    
langMappings.Add("Werkenemers", "Employees");    
langMappings.Add("Persoon", "Person"); 
// create reverse map 
foreach (var kv in langMappings.ToArray()) 
    langMappings.Add(kv.Value, kv.Key); 

var config = new MapperConfiguration(cfg => { 
    // this will allow mapping type with name from dictionary key above 
    // to another type indicated with name indicated by value 
    // so, Afdeling to Department 
    cfg.AddConditionalObjectMapper().Where((s, d) => langMappings.ContainsKey(s.Name) && langMappings[s.Name] == d.Name); 
    cfg.AddMemberConfiguration() 
    // this is default automapper configuration, 
    // see http://docs.automapper.org/en/stable/Conventions.html 
    .AddMember<NameSplitMember>() 
    .AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes, "Get")) 
    // and this one is our custom one 
    .AddName<DictionaryMapper>(_ => _.Map = langMappings); 
}); 
var mapper = config.CreateMapper(); 
var result = mapper.Map<Afdeling, Department>(new Afdeling 
{ 
    Id = 1, 
    TypeKode = "code", 
    Werkenemers = new[] { 
     new Persoon() {Id = 2} 
    } 
}); 
関連する問題