2015-01-16 10 views
7

Ich verwende folgende Klasse als Abhängigkeits-Resolver. Got Referenz von http://www.asp.net/web-api/overview/advanced/dependency-injectionFehler bei der Verwendung benutzerdefinierter Abhängigkeitsauflösungsdienste mit dem Unity- und Web-API-Controller

public class UnityWebAPIResolver : IDependencyResolver 
    { 
    protected IUnityContainer container; 

    public UnityWebAPIResolver(IUnityContainer container) 
    { 
     if (container == null) 
     { 
      throw new ArgumentNullException("container"); 
     } 
     this.container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return container.Resolve(serviceType); **// This line throws error** 
     } 
     catch (ResolutionFailedException) 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return container.ResolveAll(serviceType); **// This line throws error** 
     } 
     catch (ResolutionFailedException) 
     { 
      return new List<object>(); 
     } 
    } 

    public IDependencyScope BeginScope() 
    { 
     var child = container.CreateChildContainer(); 
     return new UnityWebAPIResolver(child); 
    } 

    public void Dispose() 
    { 
     container.Dispose(); 
    } 
} 

In WebApiConfig Klasse nach Route Konfiguration i Abhängigkeitsauflöser wie diese

config.DependencyResolver = new UnityWebAPIResolver(UnityConfig.GetContainer()); 

Das Problem ist, ich bin immer mehrere Fehler wie diese ..

InvalidOperationException - The type IHostBufferPolicySelector does not have an accessible constructor. 
InvalidOperationException - The type ModelMetadataProvider does not have an accessible constructor. 
InvalidOperationException - The type ITraceManager does not have an accessible constructor. 
InvalidOperationException - The type ITraceWriter does not have an accessible constructor. 
InvalidOperationException - The type IHttpControllerSelector does not have an accessible constructor. 
InvalidOperationException - The type IAssembliesResolver does not have an accessible constructor. 
InvalidOperationException - The type IHttpControllerTypeResolver does not have an accessible constructor. 
InvalidOperationException - The type IHttpActionSelector does not have an accessible constructor. 
InvalidOperationException - The type IActionValueBinder does not have an accessible constructor. 
InvalidOperationException - The type IContentNegotiator does not have an accessible constructor. 
InvalidOperationException - The type IHttpControllerActivator does not have an accessible constructor. 
InvalidOperationException - The type IBodyModelValidator does not have an accessible constructor. 

bin Konfiguration Auch wenn ich in meinem global.asax so etwas versuche, bekomme ich dieselben Fehler.

GlobalConfiguration.Configuration.DependencyResolver = new UnityWebAPIResolver(UnityConfig.GetContainer()); 

Frage: Alle Abhängigkeiten in mein API-Controller injiziert zu sein scheint richtig, meine einzige Sorge ist, da es nicht von oben erwähnt mehrere lösen können (Rahmen spezifisch) Arten, gibt es eine Chance, dass Es kann dazu führen, dass das gesamte Framework fehlerhaft funktioniert und zufällige Fehler generiert.

+0

Sie müssen die benutzerdefinierten Typen irgendwann zuordnen, es ist nicht magisch für Sie gemacht. Haben Sie eine 'Unity.config' Funktion? – Haney

+0

Ja alle meine benutzerdefinierten Typen sind zugeordnet und es werden keine Fehler auf meine benutzerdefinierten Typen geworfen ... Es werden nur Fehler für MVC-Framework-Typen ausgegeben, die nicht in meinem Container registriert sind. – ATHER

+0

Ahh ja, ich hatte dieses Problem zurück der Tag auch. Ich habe es behoben, aber ich muss mir meinen Quellcode ansehen, um herauszufinden, wie. Gib mir ein paar Stunden und ich werde eine Antwort schreiben. :) – Haney

Antwort

14

Es gibt kein Problem und Ihr Programm funktioniert hier wie erwartet. Was Sie sehen, sind Ausnahmen der ersten Chance, die durch die Methode Resolve von Unity ausgelöst werden. Die Ausnahme wird ausgelöst, weil Unity nie null zurückgibt, wenn ein Dienst nicht aufgelöst werden kann. IDependencyResolver.GetService Implementierungen sollten jedoch immer null zurückgeben, wenn der angeforderte Dienst nicht in der Deployment-Resolver-Implementierung registriert ist.

Wenn GetServicenull zurückgibt, greift MVC auf die Standardimplementierung des Frameworks für den angeforderten Dienst zurück. In den meisten Fällen müssen diese Dienste im Unity-Container nicht überschrieben werden. Selbst wenn ein anderer Dienst erforderlich ist, können Sie die MVC-Standardimplementierung problemlos ersetzen, ohne sie der Unity-Konfiguration hinzuzufügen.

Da jedoch erwartet wird, dass Unity diese Ausnahme auslöst, enthalten diese Methoden eine catch Klausel. Die Ausnahme, die Sie erleben, wird in dieser Methode abgefangen und null zurückgegeben.

Offensichtlich ist es sehr ärgerlich, dass der Debugger viele Male nach dem Start der Anwendung bei diesen Methoden stoppt. Daher ist es die Lösung, diese Methoden mit dem Attribut [DebuggerStepThrough] zu markieren, um zu verhindern, dass der Debugger bei diesen Methoden stoppt.

+0

Danke Steven, für eine so detaillierte Antwort. Ich mag es :) – ATHER