2017-11-13 4 views
0

Ich hatte eine Web-Lösung mit einem einzigen MVC-Projekt. Ich habe die Ninject-Bindung in diesem Projekt für die Konstruktorinjektion verwendet und es hat gut funktioniert. Jetzt fügte ich ein weiteres MVC-Projekt zu derselben Lösung hinzu und verwendete auch in diesem neuen Projekt die Konstruktionseinspritzung. Das neue Projekt wurde zum Start Up-Projekt. Aber wenn das Projekt ausgeführt wird, gibt es einen Fehler mit der Bezeichnung "Kein parameterloser Konstruktor für dieses Objekt definiert". Wenn ich einen parameterlosen Konstruktor im entsprechenden Controller hinzufüge, verschwindet dieser Fehler. Die Konstruktorbindung tritt jedoch nicht auf, da der parameterlose Konstruktor zu diesem Zeitpunkt aufgerufen wird. Ich habe sogar versucht, eine separate Bibliothek für die Auflösung von Abhängigkeiten zu erstellen und diese DLL im MVC-Projekt zu verwenden. Aber dies wird eine zirkuläre Abhängigkeit schaffen, daher war es nicht erfolgreich. Was sollte die Lösung für diese Situation sein?Dependency Injection Ausgabe von zwei MVC-Projekten in der gleichen Lösung

Antwort

0

ich dies in der Vergangenheit gelöst haben, indem MapperConfig.RegisterMaps(); in Global.asax.cs und Definition der RegisterMaps() Verfahren wie das folgende Aufruf:

public class MapperConfig 
    { 
    public static void RegisterMaps() 
    { 
     //get all projects' AutoMapper profiles using reflection 
     var assembliesToScan = System.AppDomain.CurrentDomain.GetAssemblies(); 
     var allTypes = assembliesToScan.SelectMany(a => a.ExportedTypes).ToArray(); 

     //depending on your solution, you may need allTypes to be defined as: 
     //var allTypes = assembliesToScan.Where(x => !x.IsDynamic).SelectMany(a => a.ExportedTypes).ToArray(); 

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

     //add each profile to our static AutoMapper 
     Mapper.Initialize(cfg => 
     { 
     foreach (var profile in profiles) 
     { 
      cfg.AddProfile(profile); 
     } 
     }); 
    } 
    } 

dann in der Lösung in jedem Projekt können Sie separate AutoMapper Profile haben (was ich so, dass Ihre Auto-Mapp-Bindungen in der Ebene definiert sind, die sie verwendet, anstatt alle Zuordnungen in eine riesige Datei zu werfen) wie folgt:

public class AutoMapperServicesConfig : Profile 
    { 
    public AutoMapperServicesConfig() 
    { 
     CreateMap<Entity, EntityViewModel>(); 
    } 

    public override string ProfileName 
    { 
     get { return this.GetType().ToString(); } 
    } 
    }