11
votes

Utilisation de NInject avec ASP.NET Web API Beta Apicontroller

Je suis coincé. J'utilisais la méthode décrite ici pour WCF Web API P6 NIJJECT TRAVAIL AVEC WCF API API Web 5 , mais les choses sont très différentes avec la mise en œuvre MVC dans la version bêta. Il y a un bon article ici ici http: //www.asp.net/web-api/overview/Extenbility/UST-Web-Api-DePendency-Resolver qui parle de construire votre propre résolveur de dépendance personnalisé, mais je voudrais utiliser la même mise en œuvre J'utilise pour mes contrôleurs de vue MVC ... par exemple Ninject. J'ai essayé quelques choses sur la base de l'exemple de l'unité de la COI dans l'article également, mais rien n'a été annulé. Toute aide me dirigée dans la bonne direction serait très appréciée. Je vais continuer à creuser par moi-même. Merci d'avance!

Voici où je suis à. J'utilisais webactivator pour bootstrap le code mais j'ai depuis chuté à l'application_start () juste pour prendre une autre chose de l'équation. P>

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart.ApiBootstrapper), "Start")]
namespace MyApp.AppStart
{
    public class ApiBootstrapper
    {
        public static void Start()
        {
            var kernel = new StandardKernel(new MyNinjectModule());
            var resolver = new NinjectDependencyResolver(kernel);
            GlobalConfiguration.Configuration.ServiceResolver.SetResolver(resolver.GetService, resolver.GetServices);
            GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler());
        }
    }
}


2 commentaires

Ceci est une solution assez belle: HAACKED.COM/Archive/2012/03/11/...


Découvrez également le package de @Remo Gloor ci-dessous si vous souhaitez utiliser les mêmes liaisons pour les deux types de contrôleurs. Vous pouvez le trouver sur GitHub et l'installer à partir de Nuget.


5 Réponses :


3
votes

Je n'ai jamais utilisé les webapi, mais depuis que la sémantique de l'IDEPendencyResolver est exactement la même que celle du MVC3, vous devriez pouvoir utiliser la même implémentation: https://github.com/ninject/ninject.web.mvc/blob/master/mvc3 /src/ninject.web.mvc/ninjectDependencyResolver.cs

mise à jour: L'extension NINJECT.WEB.WEBAPI ajoute la prise en charge des apicontrôleurs


2 commentaires

C'est en fait l'une des choses que j'ai essayées, sans joie malheureusement. Par exemple, Serviceresolver.Stresolver (New NinjectDependencendencendencendencendencendencendencendencendencendencyResolver (NiNel)) Produit l'erreur suivante: NInjectDependencyResolver n'apparaît pas implémenter Microsoft.practices.ServiceLocation.servicelocator


La solution était finalement utilisée pour utiliser la classe NinjectDepencencyResolver, je devais simplement utiliser une autre méthode de signature sur SETRESOLVER. Merci d'avoir répondu!



0
votes

peut sembler idiot mais vous êtes-vous assuré que vous avez une référence au package CommonerviceLocator / CommonServiceLocator.NInjectAdapter Nuget ou Assemblys associés. Votre NinjectDePendencendencendencyResolver peut ne pas être en mesure de résoudre la référence à iservicelocator.


2 commentaires

J'ai installé les deux paquets, mais toujours pas de chance. Vous pouvez voir comment le NINJECT.MVC Packacke s'inscrit actuellement via une bootstrapper personnalisée à l'aide de webactivator ... mais il doit être en dehors du cycle de vie de la demande d'apicontroller puisque ne va pas réellement au contrôleur directement ... c'est créé pour vous par le cadre.


Le problème était que mon code résolu sur cette méthode Signature msdn.microsoft.com/en-us/library/hh835505 (v = vs.108) .aspx Quand je pensais qu'il utilisait celui-ci msdn.microsoft.com/en-us/library/hh835218 (v = vs.108) .aspx . Heureusement, il y a une 3ème option qui tourne autour du problème de type. Merci pour la réponse Hamaze!



1
votes

J'ai trouvé la réponse et j'ai mis à jour ma question ci-dessus avec la solution. La solution elle-même était plus ou moins présente dans le Utilisation du résolveur de dépendance de l'API Web , je devais simplement continuer à peaufiner pour Ninject. Les deux réponses m'ont aidé à réduire rapidement cela, donc grâce à @Remo et @james.


2 commentaires

Pouvez-vous donner des exemples de code lorsque vous démarrez la liaison et le reste du code de l'adaptateur en un?


@Shawnmclean Je ne suis pas sûr de vous suivre. Dans ma solution ci-dessus, j'utilise le package Webactivator Nuget sur une classe personnalisée pour enregistrer le résolveur de dépendance NIJOJECT avec WebAPI (définissant mes liaisons dans une classe distincte dérivée de NinjectModule). Vous pouvez également prendre ce même code de méthode et le mettre dans votre méthode global.asax Files Application_Start (), je préfère simplement cette approche de bootstrapping. Il existe également une réponse ci-dessus qui mentionne la solution de Phil Haack, qui vous permet essentiellement d'utiliser les mêmes liaisons pour API MVC et Web. Cependant, je préfère ma méthode pour le moment.



0
votes

Le même code fonctionnera pour MVC et WEBAPI, cependant, car le WebAPI a été inspiré par MVC et les assemblages MVC ne doivent pas nécessairement être référencés afin d'utiliser WebAPI (ou Vise Versa), il existe une bonne quantité de duplication du code entre les deux cadres. Si vous souhaitez utiliser MVC, vos dépendances proviendront de System.web.mvc , si vous souhaitez utiliser webapi, vous utiliserez system.web.http . Si vous souhaitez utiliser les deux à la fois, vous devez différencier votre code qui à utiliser lorsque vous utilisez une résolution plus explicite d'espace de noms.

Dans votre cas, votre problème est que MVC est venu en premier et le NInjectDePendinyResolver Classe hérite de System.web.mvc.idependencyResolver . Vous voudrez créer un duplicata exact de la classe NinjectDependannyResolver et hériter à partir de System.Web.http.idependencyResolver à la place. Utilisez cette classe pour configurer votre CIO et vous serez prêt à partir.


1 commentaires

Merci pour la réponse! C'est essentiellement ce que j'ai fait dans ma réponse ci-dessus en raison du problème de duplication que vous décrivez. Cependant, comme cette surcharge existe sur Setresolver MSDN.MicRosoft .Com / FR-US / Bibliothèque / HH834083 (V = VS.108) .aspx J'ai pu contourner la création d'un résolveur de dépendance Niject en double qui implémente la version System.Web.http de l'interface. Je souhaite qu'ils aient eu une meilleure façon de gérer cela. Je devrais vraiment pouvoir utiliser le même résolveur de dépendance pour les deux.



0
votes

J'ai trouvé une belle solution ici .

C'est assez facile si tu es assez facile si tu es assez facile. Re déjà en utilisant la Commonservicelocator / BootsTrapper Ninject: P>

private static IKernel CreateKernel() {
   var kernel = new StandardKernel();
   RegisterServices(kernel);

   GlobalConfiguration.Configuration.ServiceResolver
      .SetResolver(new NinjectServiceLocator(kernel));
   return kernel; 
}


0 commentaires