9 votes

Ninject travaillant avec WCF Web API Preview 5

Quelqu'un peut-il m'indiquer la bonne direction pour faire fonctionner Ninject avec WCF Web API Preview 5 ? J'ai réussi à le faire fonctionner dans mon projet ASP.NET MVC 3 et aussi dans un autre service WCF interne en utilisant la bibliothèque Ninject.Extensions.Wcf. Cependant, je n'arrive pas à le faire fonctionner en créant un nouveau projet MVC 3 et en obtenant la bibliothèque WebApi.All de NuGet.

J'ai regardé ce post sur stackoverflow Configuration de Ninject avec la nouvelle API Web WCF mais je n'arrive pas à le faire fonctionner, ce qui pourrait être dû à certains changements dans la dernière version.

Je ne sais pas non plus à quelles bibliothèques Ninject me référer en plus de la principale. Dois-je utiliser les bibliothèques Ninject.MVC3 , Ninject.Extensions.Wcf.

Toute aide à ce sujet serait très appréciée.

****UPDATE**

Le code que j'utilise est celui de la réponse à la question mentionnée ci-dessus. Je l'ai placé dans son propre fichier de 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
        }
    }

C'est ce que j'ai dans mon global.asax :

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

Le problème que je rencontre est que l'interface IResourceFactory n'est pas reconnue et que la méthode HttpConfiguration.Create() n'existe plus. Je dois donc définir la SetResourceFactory d'une autre manière, ce que j'ai essayé de faire en utilisant la méthode HttpConfiguration().CreateInstance, mais sans succès.

9voto

zanewill Points 108

Voici mon code avec Ninject et WebApi, il fonctionne. Créer une classe qui hérite de 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>();
    }

}

et utiliser la NinjectWebApiConfiguration dans RegisterRoutes

public static void RegisterRoutes(RouteCollection routes) {

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

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

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

4voto

Alexander Zeitler Points 2141

Dans P5, vous devez dériver de WebApiConfiguration et utiliser votre configuration dérivée :

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

3voto

tugberk Points 16203

Il existe d'excellentes réponses à cette question, mais je voudrais vous montrer la voie à suivre avec la configuration WebApi par défaut :

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

L'article de blog ci-dessous parle un peu de l'intégration de Ninject sur WCF Web API :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X