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) { ... }

La stacktrace n'est pas suffisant pour savoir quel est votre problème, merci de poster le code de votre 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