2011-09-29 8 views
9

Qualcuno può indicarmi la direzione giusta per far funzionare Ninject con l'anteprima 5 dell'API Web WCF? L'ho installato e avviato correttamente nel mio progetto ASP.NET MVC 3 e anche in un altro servizio WCF interno che utilizza la libreria Ninject.Extensions.Wcf. Tuttavia non riesco a farlo funzionare quando si crea un nuovo progetto MVC 3 e si ottiene la libreria WebApi.All da NuGet.Come funziona con l'API Web WCF Anteprima 5

Ho esaminato questo post StackOverflow Setting up Ninject with the new WCF Web API ma non riesco a farlo funzionare che credo possa avere a che fare con alcune delle modifiche nell'ultima versione.

Sono inoltre sicuro di quali librerie Ninject fare riferimento oltre quella principale. Uso il Ninject.MVC3, Ninject.Extensions.Wcf.

Qualsiasi aiuto su questo sarebbe molto apprezzato.

**** UPDATE **

codice che sto usando, che è dalla risposta alla questione di cui sopra. Ho questo nel suo file di classe.

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 
     } 
    } 

Questo ho nel mio global.asax:

var configuration = HttpConfiguration.Create().SetResourceFactory(new NinjectResourceFactory()); 
RouteTable.Routes.MapServiceRoute<myResource>("resource", configuration); 

Il problema che sto avendo è che l'interfaccia IResourceFactory non viene riconosciuto e che il HttpConfiguration.Create() non esiste più, quindi ho bisogno per impostare SetResourceFactory in un altro modo che ho provato a fare utilizzando il metodo HttpConfiguration(). CreateInstance ma senza gioia.

+0

Si prega di inviare il vostro codice –

+0

@Alexander hanno inviato un aggiornamento con il codice come richiesto. – Cragly

risposta

9

seguente è il mio codice con Ninject e WebAPI, funziona. Crea un inherites classe da WebApiConfiguration

public class NinjectWebApiConfiguration : WebApiConfiguration { 
    private IKernel kernel = new StandardKernel(); 

    public NinjectWebApiConfiguration() { 
     AddBindings(); 
     CreateInstance = (serviceType, context, request) => kernel.Get(serviceType); 
    } 

    private void AddBindings() { 
     kernel.Bind<IProductRepository>().To<MockProductRepository>(); 
    } 

} 

e utilizzare il NinjectWebApiConfiguration in RegisterRoutes

public static void RegisterRoutes(RouteCollection routes) { 

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    var config = new NinjectWebApiConfiguration() { 
     EnableTestClient = true 
    }; 

    routes.MapServiceRoute<ContactsApi>("api/contacts", config); 
} 
+0

Ho usato questo approccio per far funzionare il collegamento Ninject con un 'HttpSelfHostServer' utilizzando la versione di rilascio di WebApi.Il metodo 'CreateInstance' è sostituito da' DependencyResolver = new NinjectDependencyResolver (kernel); ' – neontapir

4

In P5 si deve derivare da WebApiConfiguration e utilizzare la configurazione derivata:

public class NinjectConfiguration : WebApiConfiguration 
    { 
     public NinjectConfiguration(IKernel kernel) 
     { 
      CreateInstance((t, i, m) => 
      { 
       return kernel.Get(t); 
      }); 
     } 
    } 
+0

Grazie Alexander ma da dove viene il SetServiceInstanceProvider come VS dice che non può risolverlo? Mi manca uno spazio dei nomi? Il mio progetto ha bisogno delle estensioni ninja MVC/WCF. Ho creato un nuovo file di classe chiamato NinjectConfiguration e aggiunto il codice che hai fornito. Inoltre a che punto dovrei caricare il mio modulo di Ninject Serivce. In uno dei miei servizi WCF standard lo chiamo in questo modo: IKernel kernel = new StandardKernel (nuovo NinjectServiceModule()); Grazie mille. – Cragly

+0

Mi dispiace, mio ​​errore. Mi riferivo a una versione errata dell'API Web di CodePlex. Ora è chiamato CreateInstance - ha aggiornato il codice sopra. –

3

Ci sono grandi risposte alla domanda qui, ma vorrei mostrarvi la strada con la configurazione WebAPI di default:

protected void Application_Start(object sender, EventArgs e) { 

     RouteTable.Routes.SetDefaultHttpConfiguration(new Microsoft.ApplicationServer.Http.WebApiConfiguration() { 
      CreateInstance = (serviceType, context, request) => GetKernel().Get(serviceType) 
     }); 

     RouteTable.Routes.MapServiceRoute<People.PeopleApi>("Api/People"); 
    } 

    private IKernel GetKernel() { 

     IKernel kernel = new StandardKernel(); 

     kernel.Bind<People.Infrastructure.IPeopleRepository>(). 
      To<People.Models.PeopleRepository>(); 

     return kernel; 
    } 

Il post di blog qui sotto parla un po 'di integrazione di Ninject su API Web WCF:

http://www.tugberkugurlu.com/archive/introduction-to-wcf-web-api-new-rest-face-ofnet

+0

Questa soluzione sembra carina; la chiave sta utilizzando la proprietà delegato di CreateInstance di HttpConfiguration (o la WebApiConfiguration derivata, come si sta usando). Tuttavia, penso che la tua soluzione introdurrà un kernel Ninject e imposterà l'associazione su ogni richiesta a quel tipo di servizio! Forse è meglio aggiungere di nuovo Ninject e impostare il binding in Application_Start, archiviare il riferimento in un campo statico privato, utilizzarlo per creare tipi di servizio e smaltirlo in Application_End. –

+0

@AndrewWebb grazie per il suggerimento. Puoi fornire un esempio di ciò che stai cercando di spiegare? puoi commentare il mio post: http://www.tugberkugurlu.com/archive/introduction-to-wcf-web-api-new-rest-face-ofnet o qui. – tugberk

+0

Ho provato ad aggiungere un campione completo in una nuova risposta, ma la formattazione era spazzatura. Ad ogni modo, nella classe in Global.asax.cs, aggiungi questo campo: statico privato IKernel _ninKernel; Crea un nuovo kernel standard in Application_Start e archivia il riferimento in questo campo e configura i tuoi binding. Smaltire questo oggetto kernel in Application_End: - _ninKernel.Dispose(); Utilizzare questo campo per le istanze del servizio di rinnovo quando si imposta la configurazione di Http: - CreateInstance = (serviceType, context, request) => _ninKernel.Get (serviceType), –

Problemi correlati