MVC 4 Web Api Contrôleur n'a pas de constructeur par défaut?
Ici, c'est la trace:
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Type 'ProjectName.Web.Api.Controllers.ContinentsController' does not have a default constructor
</ExceptionMessage>
<ExceptionType>System.ArgumentException</ExceptionType>
<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)
</StackTrace>
</Error>
Je trouve cela bizarre que public class UsersController : ApiController { ... }
fonctionne correctement. J'ai comparé les 2 contrôleurs, tous les paramètres et les structures sont similaires.
Je suis en utilisant Ninject
et j'ai mon système de configuration similaire à Jamie Kurtz
Asp.Net Mvc 4 et de l'Api du Web: la Construction d'un Service REST du Début à la fin.
À partir de la trace de la pile, quelqu'un est-il en mesure de repérer le problème et comment le résoudre? Merci!
Comme Demandé.
ContinentsController
[LoggingNHibernateSession]
public class ContinentsController : ApiController
{
private readonly ISession _session;
private readonly IContinentMapper _continentMapper;
private readonly IHttpContinentFetcher _httpContinentFetcher;
private readonly IDateTime _dateTime;
public ContinentsController(ISession session, IContinentMapper continentMapper, IHttpContinentFetcher continentFetcher, IDateTime dateTime)
{
_session = session;
_continentMapper = continentMapper;
_httpContinentFetcher = continentFetcher;
_dateTime = dateTime;
}
public IEnumerable<Continent> Get()
{
var continents = _session
.Query<Data.Model.Continent>()
.Select(_continentMapper.CreateContinent)
.ToList();
return continents;
}
public Continent Get(long id)
{
var modelContinent = _httpContinentFetcher.GetContinent(id);
var continent = _continentMapper.CreateContinent(modelContinent);
return continent;
}
}
UsersController: Fonctionne très bien.
public class UsersController : ApiController
{
private readonly ISession _session;
private readonly IUserManager _userManager;
private readonly IUserMapper _userMapper;
private readonly IHttpUserFetcher _userFetcher;
public UsersController(
IUserManager userManager,
IUserMapper userMapper,
IHttpUserFetcher userFetcher,
ISession session)
{
_userManager = userManager;
_userMapper = userMapper;
_userFetcher = userFetcher;
_session = session;
}
[Queryable]
public IQueryable<Data.Model.User> Get()
{
return _session.Query<Data.Model.User>();
}
[LoggingNHibernateSession]
public User Get(Guid id)
{
var user = _userFetcher.GetUser(id);
return _userMapper.CreateUser(user);
}
}
Je suis en utilisant NinjectWebCommon.cs
et j'ai cela et quelques autres méthodes par défaut.:
private static void RegisterServices(IKernel kernel)
{
var containerConfigurator = new NinjectConfigurator();
containerConfigurator.Configure(kernel);
GlobalConfiguration.Configuration.MessageHandlers.Add(kernel.Get<BasicAuthenticationMessageHandler>());
}
Puis j'ai NinjectConfigurator.cs
:
public class NinjectConfigurator
{
......
private void AddBindings(IKernel container)
{
.....
container.Bind<IDateTime>().To<DateTimeAdapter>();
container.Bind<IDatabaseValueParser>().To<DatabaseValueParser>();
//HttpFetchers
container.Bind<IHttpUserFetcher>().To<HttpUserFetcher>();
container.Bind<IHttpContinentFetcher>().To<HttpContinentFetcher>();
//TypeMappers
container.Bind<IUserManager>().To<UserManager>();
container.Bind<IMembershipInfoProvider>().To<MembershipAdapter>();
container.Bind<IUserMapper>().To<UserMapper>();
container.Bind<IContinentMapper>().To<ContinentMapper>();
.........
}
.......
}
Les deux NinjectWebCommon.cs
et NinjectConfigurator.cs
sont situés dans le App_Start
dossier.
container.Bind<ISession>().ToMethod(CreateSession);
est NHibernate
. C'est dans NinjectConfigurator.cs
à l'intérieur de private void ConfigureNHibernate(IKernel container) { ... }
ContinentsController
!Vous avez copié le code de la
ContinentsController
deux fois... mais peu importe. Le problème, c'est que l'un des votre constructeur dépendances ISession session, IContinentMapper continentMapper, IHttpContinentFetcher continentFetcher, IDateTime dateTime
n'est pas enregistré dans Ninject. Assurez-vous que tout est enregistré ou d'afficher votre noyau des fixations permet de nous ce qui est manquant. Et votre UserController fonctionne très bien car il a un jeu complètement différent de dépendances.J'ai ajouté ce que vous avez demandé.
Une chose que vous pouvez vérifier: assurez-vous également que tous le constructeur paramètres de la
HttpContinentFetcher
et ContinentMapper
ont également été enregistrés dans le contianer...HttpContinentFetcher
a ISession
et ContinentMapper
prendrait de l'enfant de l'objet Mappeurs. ISession
est déjà enregistré, et si j'avais un enfant de je Continents.e pays, il serait enregistré.
OriginalL'auteur Komengem | 2013-07-04
Vous devez vous connecter pour publier un commentaire.
Cette erreur est une erreur connue lorsque vous ne définissez pas la résolution de dépendances dans votre application. Le Contrôleur de l'Usine ne pouvait pas trouver un constructeur sans paramètre pour créer le contrôleur et exécuter la méthode action (ou un verbe méthode?). Ainsi, vous devez créer un solveur de dépendances classe et le mettre sur l'initialisation de votre application web. Il permettra de résoudre les dépendances de vos contrôleurs.
À l'aide de
ninject
, vous pouvez essayer quelque chose comme ceci:La
NinjectDependencyResolver
classe prend unNinject StandardKernel
objet comme un argument du constructeur et cette référence est utilisée chaque fois qu'une dépendance de la portée est en pipeline.Pour faire ce travail, le
NinjectDependencyResolver
classe est affecté à l'application de configuration globale:Sur votre
Global.asax.cs
fichier à la fin de l'événement Application_Start, appelez ceCreateKernel
méthode.GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
à mon NinjectWebCommon, n'est-ce pas à appeler la méthode mondial.asax.cs. MerciOriginalL'auteur Felipe Oriani
Vous devez indiquer Ninject comment résoudre correctement l'API Web de dépendances.
Vous pouvez utiliser Felipe Oriani réponse, mais si vous voulez il y a un package NuGet appelé WebApiContrib.Cio.Ninject qui le fera pour vous.
Dans Visual Studio, Allez à: Outils > Gestionnaire de Package NuGet > Gérer
Les Packages NuGet pour Solution
Installer le WebApiContrib.Cio.Ninject paquet
Edit: NinjectWebCommon.cs et mise à jour de la CreateKernel() méthode pour inclure:
GlobalConfiguration.La Configuration.DependencyResolver = new NinjectResolver(noyau);
merci man, merci beaucoup, il a été d'une grande aide codage heureux :d
OriginalL'auteur crabCRUSHERclamCOLLECTOR
J'ai aussi couru dans cette même erreur, mais d'une autre cause à l'aide de
Ninject
. J'ai effectivement eu la résolution de dépendances et de la configuration correcte. En fait, l'application fonctionnait bien jusqu'à ce que j'ai essayé de résoudre une autre nouvelle dépendance. J'ai eu l'enregistrement pour elle, donc je ne pouvais pas comprendre ce qui manquait.Le problème était que je accidentellement résolu à l'Interface de la même Interface plutôt que de régler le bon type de béton. Donc, en utilisant un exemple de l'OP, je n'ai la suite de laquelle les résultats à l'identique d'erreur:
Avis que la résolution de
IUserManager
qui était un oubli, mais il ne conduire à l'identique de l'erreur de l'OP. Évidemment, la solution est de régler le bon type de béton.OriginalL'auteur atconway
Accepté la réponse est à partir de 2014. Depuis des tonnes de gens ont eu ce problème, dès 2016, il y a une recette pour cela. Cela ajoute à la accepté de répondre.
La façon dont je le fais, c'est par l'installation de paquets
Ninject.MVC3
etWebApiContrib.IoC.Ninject
. Un fichier appeléNinjectWebCommon
est ajoutée à votreApp_Start
dossier. Vous pouvez ensuite utiliser le haut -NinjectResolver
.Il suffit d'ajouter cette méthode:
et de l'appeler avant d'appeler
RegisterServices
.OriginalL'auteur andrei.ciprian
J'ai eu ce problème aussi, mais il s'est avéré que l'un de mes interfaces n'étaient pas réellement mis en œuvre par toutes les classes (j'ai oublié de l'ajouter à la déclaration de la classe).
OriginalL'auteur Mark Cidade
C'est un problème commun qui se produit principalement lorsque vous travaillez avec des Ninject Conteneur d'injection de Dépendance.
Veuillez suivre les étapes suivantes pour résoudre ce problème.
De nouveau aller pour cela et Installer ce-
Maintenant vérifier que le App_start dossier.Vous trouverez la chose suivante(NinjectWebcommon.cs).
Maintenant, double-cliquez sur et vérifiez la ligne suivante dans CreateKernel() méthode comme ceci
Et ensuite Enregistrer votre dependincy comme ce
Je suis sûr que cela va rendre votre solution de travail.
OriginalL'auteur Debendra Dash
Assurez-vous que le<> la partie est de la classe de béton pas une interface, car cela va créer le même message d'erreur aussi!
OriginalL'auteur Andrew Day
Pour moi, c'était juste une question d'ajouter de la Ninject.Web.WebApi.Hébergeur package NuGet.
Pour mes applications qui utilisent à la fois MVC et WebApi2, j'ai les paquets suivants pour Ninject:
OriginalL'auteur Jamie M