2015-01-16 8 views
7

Sto utilizzando la seguente classe come resolver di dipendenze. Ottenuto riferimento dal http://www.asp.net/web-api/overview/advanced/dependency-injectionErrori durante l'utilizzo del resolver di dipendenze personalizzato con Unity e controller API Web

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 classe WebApiConfig dopo la configurazione percorso Sto configurando dipendenza risolutore come questo

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

Il problema è che sto ottenendo diversi errori come questo ..

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. 

Anche se provo a fare qualcosa del genere nel mio global.asax sto ricevendo gli stessi errori.

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

Domanda: Tutte le dipendenze nel mio controller API sembra essere iniettato correttamente, la mia unica preoccupazione è dato che non è possibile risolvere molti dei sopra menzionati (quadro specifico) tipi, c'è qualche possibilità che può causare l'intero malfunzionamento della struttura e generare errori casuali?

+0

Devi mappare i tipi personalizzati ad un certo punto, non è magicamente fatto per te. Hai un 'Unity.config' che lo fa? – Haney

+0

Sì, tutti i miei tipi personalizzati sono mappati e non lanciano alcun errore sui miei tipi personalizzati ... Genera solo errori per i tipi di framework MVC che non sono registrati nel mio contenitore .. – ATHER

+0

Ahh sì, ho avuto questo problema di nuovo anche il giorno. L'ho risolto ma dovrò guardare il mio codice sorgente per scoprire come. Dammi un paio d'ore e posterò una risposta. :) – Haney

risposta

14

Nessun problema e il programma funziona come previsto qui. Quello che vedi sono le eccezioni di prima scelta generate dal metodo Resolve dell'Unity. L'eccezione viene generata perché Unity non restituirà mai null quando un servizio non può essere risolto. Le implementazioni IDependencyResolver.GetService tuttavia dovrebbero sempre restituire null se il servizio richiesto non è registrato nell'implementazione del risolutore di dipendenze.

Se GetService restituisce null, MVC ripiega sull'implementazione predefinita del framework per il servizio richiesto. Nella maggior parte dei casi non è necessario sovrascrivere tali servizi nel contenitore Unity e anche quando è richiesto un servizio diverso, è possibile sostituire facilmente l'implementazione predefinita di MVC senza aggiungerla alla configurazione di Unity.

Ma poiché Unity è previsto che generi questa eccezione, è per questo che tali metodi contengono una clausola catch. Quindi l'eccezione che stai riscontrando viene catturata in quel metodo e viene restituito un valore nullo.

Ovviamente è molto fastidioso che il debugger si fermi con questi metodi molte volte dopo l'avvio dell'applicazione, quindi la soluzione è contrassegnare tali metodi con l'attributo [DebuggerStepThrough], per impedire l'arresto del debugger in questi metodi.

+0

Grazie Steven, per una risposta così dettagliata. Mi piace :) – ATHER

Problemi correlati