2011-05-06 9 views
7

Così ho giocato con l'ultima versione di WCF Web API e ho deciso di approfondire l'implementazione di Ninject.Impostazione di Ninject con la nuova API Web WCF

base al largo quello che ho letto ho bisogno di attuare l'IResourceFactory interfaccia che richiede i seguenti metodi:

public object GetInstance(System.Type serviceType, 
           System.ServiceModel.InstanceContext instanceContext, 
           System.Net.Http.HttpRequestMessage request); 

    public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, 
           object service); 

così ho pollo scalfito la seguente out:

public class NinjectResourceFactory : IResourceFactory 
{ 
    private readonly IKernel _kernel; 

    public NinjectResourceFactory() 
    { 
     var modules = new INinjectModule[] 
          { 
           new ServiceDIModule(), //Service Layer Module 
           new RepositoryDIModule(), //Repo Layer Module 
           new DataServiceDIModule() 
          }; 

     _kernel = new StandardKernel(modules); 
    } 

    #region IResourceFactory Members 

    public object GetInstance(Type serviceType, 
           InstanceContext instanceContext, 
           HttpRequestMessage request) 
    { 
     return Resolve(serviceType); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object service) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 

    private object Resolve(Type type) 
    { 
     return _kernel.Get(type); 
    } 

    //private T Resolve<T>() 
    //{ 
    // return _kernel.Get<T>(); 
    //} 

    //private T Resolve<T>(string name) 
    //{ 
    // return _kernel.Get<T>(metaData => metaData.Has(name)); 
    // return _kernel.Get<T>().Equals(With.Parameters. 
    //         ContextVariable("name", name)); 
    //} 
} 

e cablato in su con

var configuration = HttpHostConfiguration.Create().SetResourceFactory(new NinjectResourceFactory()); 
    RouteTable.Routes.MapServiceRoute<StateProvinceResource>("States", configuration); 

Incredibilmente, questo sembra funzionare. Il primo metodo di risorsa che ho creato per fornire un elenco di stati/province genera output con HTTP 200 OK.

Quindi, alla domanda. C'è un modo per scrivere cleaner? Mi sono davvero fottuto e non mi sembra giusto. Mi sento come se mi mancasse qualcosa di ovvio che mi fissava in faccia. L'hack che ho realizzato con il nuovo metodo Resolve mi sembra particolarmente sporco, quindi ho pensato di attingere a quelli più esperti per stringere la questione. Qualcun altro ha implementato Ninject con l'API Web WCF e implementato una soluzione più pulita?

Grazie per qualsiasi input!

+0

questo sembra relativamente simile a qualcosa che ho fatto con structuremap. passare intorno agli oggetti sembra sempre un po 'hacky, ma se è ciò che ti dà la struttura, che scelta c'è, oltre a farti strada naturalmente. –

risposta

0

È possibile implementarlo passando il kernel dall'ambito dell'applicazione.

public class NinjectResourceFactory : IResourceFactory 
{ 
    private readonly IKernel _kernel; 

    public NinjectResourceFactory(IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request) 
    { 
     return _kernel.Get(serviceType); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object service) 
    { 
     // no op 
    } 
} 
+0

Sì, questo pulisce la fabbrica un bel po '. La parte che stavo davvero cercando di azzerare era il metodo Resolve che veniva messo in un angolo per restituire un oggetto invece di un risultato tipizzato, ma immagino che questa implementazione dovrà fare fino a quando il team di Microsoft non modificherà il valore restituito. – Khepri

+0

Da dove proviene IResourceFactory? Si tratta di un'interfaccia API Web? Sto cercando di farlo funzionare con Anteprima 5 dell'API Web senza fortuna? Hai usato le estensioni Ninject.MVC o WCF o entrambe? Grazie. – Cragly

+0

@Cragly questa risposta era per Anteprima 3 Penso, non applicabile a Anteprima 5 – Jonathan

Problemi correlati