2016-07-26 19 views
-1

Wir haben eine Anwendung, die wir erstellen, und wir haben eine DataTranslationLayer, die für das Übersetzen eines Datenbankobjekts in ein Ansichtsmodellobjekt verantwortlich ist.AutoMapper Initialize

Da wir unsere Datenbankobjekte nicht an das Webprojekt übergeben, können wir in global.asax nicht initialisieren. Wir müssten in der DataTranslationLayer initialisieren.

Das Problem damit ist, dass wenn wir die Klasse instanziieren, es eine andere initialisiert und das jetzt Probleme verursacht, da AutoMapper nur einmal initialisiert werden soll.

Also meine Frage ist, hat jemand eine ähnliche Lösung implementiert und was hast du getan?

Ist die Lösung zum Erstellen einer statischen Klasse in der DTL, die wir beim Start der Anwendung aufrufen, oder gibt es eine elegantere Lösung?

Antwort

0

Der statische AutoMapper ist nur eine dünne Schicht. Sie können problemlos eine oder mehrere Instanzen von AutoMapper mit jeweils unterschiedlicher Konfiguration erstellen. Siehe hierzu my other answer, um dies zu tun.

+0

Hmmm, interessant. Vielen Dank – griegs

0

Ich weiß nicht, was es bedeutet, dass Sie nicht Datenbankobjekte in das Webprojekt übergeben, aber vielleicht haben Sie eine komplizierte geschichtete Architektur. In diesem Fall eine Möglichkeit, dies zu tun, ist die Reflexion zu verwenden, um alle Profile zu laden:

var assembliesToScane = AppDomain.CurrentDomain.GetAssemblies(); 
    var allTypes = assembliesToScan.SelectMany(a => a.ExportedTypes).ToArray(); 

    var profiles = 
     allTypes 
      .Where(t => typeof(Profile).GetTypeInfo().IsAssignableFrom(t.GetTypeInfo())) 
      .Where(t => !t.GetTypeInfo().IsAbstract); 

    Mapper.Initialize(cfg => 
    { 
     foreach (var profile in profiles) 
     { 
      cfg.AddProfile(profile); 
     } 
    }); 

Sie nicht direkt ein beliebiges Profil verweisen, sondern nur alle von den aktuellen AppDomain Profil laden.