Erreur du constructeur sans paramètre avec les liaisons Ninject in.NET Api web 2.1
Travaille actuellement sur l'écriture D'un site API (. Net Web Api 2.1)
Pour nos sites API précédents, nous avions utilisé le Ninject.MVC3 paquet et câblé un résolveur de dépendance et portée manuellement et branché dans notre logique dans NinjectWebCommon selon la recommandation.
Cela causait des brûlures d'estomac dans notre nouveau projet avec l'erreur du constructeur sans paramètre. Dans le passé, c'était un cadeau mort que nous ne câblions pas correctement le résolveur de dépendance dans L'Api Web. Seulement, cette fois, nous être. Elle était là.
var resolver = new NinjectDependencyResolver(kernel);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
Donc j'étais un peu perdu. La semaine dernière, J'ai vu que Ninject a été mis à jour, le paquet WebAPI nuget a été relancé, alors j'ai décidé d'essayer de l'implémenter.
J'ai installé le paquet NuGet Ninject.Web.WebApi (version 3.2). Cela ne semblait pas inclure un NinectWebCommon.fichier cs pour appliquer les liaisons. Il a seulement ajouté les assemblages nécessaires. Faire quelques recherches je suis tombé sur ce application.
Https://gist.github.com/odytrice/5842010
(Je ne savais pas si le paquet Nuget faisait cela pour moi et tout cela est du code redondant. Si c'est le cas, génial, j'ai juste besoin de comprendre comment ajouter nos liaisons avec le paquet nuget maintenant.)
J'ai implémenté cette ligne pour la ligne sauf où charger les modules, j'ai chargé nos trois modules individuels en tant que test.
public static INinjectModule[] Modules
{
//get { return new INinjectModule[] { new MainModule() }; }
get { return new INinjectModule[] { new GlobalModule(), new InventoryModule(), new StoreModule() }; }
}
J'ai vérifié que le résolveur de dépendances est défini avec ce nouveau code.
_resolver = new NinjectHttpResolver(modules);
GlobalConfiguration.Configuration.DependencyResolver = _resolver;
Mais le problème persiste.
ExceptionMessage:
An error occurred when trying to create a controller of type 'StoreSearchController'.
Make sure that the controller has a parameterless public constructor.
StackTrace:
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()
Exception Interne Type D'Exception: Système.ArgumentException
StackTrace:
at System.Linq.Expressions.Expression.New(Type type)
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
Je suis perdu. J'ai vu beaucoup de messages autour d'avoir à définir un résolveur de dépendance MVC, mais je ne pensais pas que cela était lié car dans ce cas, nous n'avons pas de contrôleurs MVC en dehors du contrôleur domestique qui n'utilise pas Ninject.
Une autre friandises qui peut ou pas d'importance. Nous utilisons le routage des attributs.
Toute aide est appréciée.
2 réponses
, Vous devez installer l'un des forfaits d'hébergement:
- Ninject.Web.WebApi.Hébergeur
- Ninject.Web.WebApi.SelfHost
- Ninject.Web.WebApi.OwinHost
Vérifiez également que votre constructeur est Public. C'est facile à oublier.