2016-06-15 12 views
1

I die Struktur wie haben so zu konstruieren:Unity Bootstrap-Programm für ASP.NET MVC (durch Konvention) nicht in der Lage Schnittstellen in einem anderen Projekt

  • MyWork.BLL
  • MyWork.DAL
  • Meinearbeit. Schnittstellen
  • MyWork.Models
  • MyWork.Web

ich habe die Einheit von Convention-Setup in MyWork.Web-Projekt. Es funktioniert gut, wenn ich Service.cs und IService.cs unter MyWork.BLL verlasse. Ich versuche IService.cs zu MyWork.Interfaces für Organisation und Entkopplung zu verschieben. Auf diese Weise muss ich mich bei der Arbeit am Webprojekt nur um die Kodierung gegen die Schnittstelle kümmern und die Verwendungsanweisung für MyWork.Interfaces hinzufügen. Wenn ich jedoch versuche, IService.cs in das Schnittstellenprojekt zu verschieben, funktioniert Unity by Convention nicht mehr. Wer weiß, ob das möglich ist? Muss ich die Schnittstelle und ihre Implementierung immer im selben Projekt halten, damit Unity by Convention ordnungsgemäß funktioniert? Hier ist mein Code für die Einheit durch Konvention:

public static void RegisterTypes(IUnityContainer container) 
    { 
      container.RegisterTypes(
      AllClasses.FromLoadedAssemblies(), 
      WithMappings.FromMatchingInterface, 
      WithName.Default); 
    } 

Hier ist der Fehler:

Stromart, MyWork.Interfaces.IService, ist eine Schnittstelle und nicht konstruiert werden kann. Vermissen Sie ein Typ-Mapping?

Update:

UnityConfig.cs unter App_Start von MyWork.Web

namespace MyWork.Web.App_Start 
{ 
public class UnityConfig 
{ 
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer(); 
     RegisterTypes(container); 
     return container; 
    }); 

    public static IUnityContainer GetConfiguredContainer() 
    { 
     return container.Value; 
    } 

    public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<ICalculatorService, Interfaces.ICalculatorService>(); // added this per suggested answer 

     container.RegisterTypes(
      AllClasses.FromLoadedAssemblies(), 
      WithMappings.FromMatchingInterface, 
      WithName.Default); 
    } 
} 

}

Antwort

0

Ich wette, die MyWork.Interfaces Versammlung wurde noch nicht geladen. Der Aufruf FromLoadedAssemblies von Unity ruft einfach AppDomain.CurrentDomain.GetAssemblies() auf, die per Definition nur Assemblys zurückgibt, die geladen werden (nicht alle referenzierten Assemblys!).

Es gibt zwei Möglichkeiten:

  1. Referenz einen Typen in der MyWork.Interfaces Montage explizit in Ihren RegisterTypes Methoden. Dies stellt sicher, dass die Baugruppe geladen wird.
  2. Anruf System.Web.Compilation.BuildManager.GetReferencedAssemblies() vor dem Anruf container.RegisterTypes. Der Aufruf GetReferencedAssemblies() lädt alle Assemblys, die sich im Ordner web applications/bin befinden. Dadurch wird sichergestellt, dass nicht nur Ihr Interfaces Projekt, sondern alle Projekte geladen werden.
+0

danke für Ihre Hilfe. Option 1 funktioniert perfekt für mich. Option 2 gibt jedoch eine Fehlermeldung zurück "Diese Methode kann nicht während der Initialisierungsphase der Anwendung vor dem Start aufgerufen werden." Ich habe das über dem Registertyp versucht und es auch in die Datei global.aspx gestellt. – NKD

+0

Mein Gedanke zu Option 1 - Ich nutze derzeit die Vorteile der Einheitsregistrierung per Konvention und wenn ich sie innerhalb der RegisterTypes-Methode explizit angeben muss ..., wird der Zweck von "Register by Convention" etwas verfehlt. Deshalb erwähne ich im obigen Kommentar Option 1 für mich, aber ich möchte immer noch Option 2 erkunden. Ich hoffe, Sie können helfen. Danke im Voraus. – NKD

+1

Verschieben Sie die Registrierung von Unity zu einem späteren Zeitpunkt in der Anwendungsstartphase.Zum Beispiel zu Application_Start. – Steven