36 votes

Liaison API Web ASP.NET avec ninject

Je viens d'installer la mvc4 rc de mise à jour et je suis en train de construire une application de l'api avec un peu de chance.

Je suis à l'aide de ninject, mais ne peux pas obtenir mon contrôleurs de charge. Je reçois un message d'erreur

Type 'Api.Les contrôleurs.ConsumerController " n'a pas de constructeur par défaut

Je suis très nouveau à la mvc et à l'aide d'injection de sorte s'il vous plaît garder avec moi.

Je n'ai pas fait quelque chose de spécial pour la liaison par défaut qui est créé via nuget

 public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IConsumerRepository>().To<ConsumerRepository>();
    }        
}

Mon contrôleur ressemble

   private readonly IConsumerRepository _repository;

    public ConsumerController(IConsumerRepository repository)
    {
        _repository = repository;
    }

    [HttpGet]
    public IQueryable<Consumer> Get(Guid id)
    {
        return _repository.Get(id).AsQueryable();
    }

Que dois-je faire pour obtenir les contrôleurs d'api pour travailler avec ninject?

Désolé si c'est des choses simples

J'ai essayé ta suggestion Michael toutefois, après le changement de la webcommon.cs à ce

  private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IConsumerRepository>().To<ConsumerRepository>();
    }

J'obtiens une erreur lors de l'

var kernel = new StandardKernel();

est appelé

La méthode 'GetFilters' en type 'Ninject.Web.WebApi.Le filtre.DefaultFilterProvider " à partir de l'assembly 'Ninject.Web.WebApi, Version=3.0.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7' n'a pas de mise en œuvre.

Ce qui me manque?

60voto

Michael Baird Points 1082

J'ai demandé à Brad Wilson à ce sujet et il a changé à MVC4 RC.

GlobalConfiguration.La Configuration.ServiceResolver a été déplacé à GlobalConfiguration.La Configuration.DependencyResolver

Utilisez cette application pour créer un Ninject DependencyResolver pour votre site Web Api: https://gist.github.com/2417226

Dans NinjectWebCommon.cs:

// Register Dependencies
RegisterServices(kernel);

// Set Web API Resolver
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);

6voto

bks Points 168

Ce message d'erreur générique

Le type 'Api.Controllers.ConsumerController' n'a pas de constructeur par défaut

Cela peut également se produire si vous ne rendez pas votre constructeur public ou si la dépendance ne peut pas être résolue par le conteneur IoC, peut-être à cause d'un argument manquant.

Le message d'erreur est pour le moins trompeur.

6voto

Ryan Spears Points 1524

Vous pouvez installer le package NuGet WebApiContrib.IoC.Ninject et ajouter la ligne de code suivante à NinjectWebCommon.cs.

 GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
 

0voto

jflood.net Points 822

avez-vous enregistré le récipient avec le frawework? Je préfère utiliser l'autofac, voici un exemple de comment utiliser autofac avec l'API. http://alexmg.com/post/2012/03/08/Autofac-ASPNET-Web-API-%28Beta%29-Integration.aspx

Aussi, la Marque de Seeman a un bon post sur DI en général avec WebAPI

http://blog.ploeh.dk/2012/03/20/RobustDIWithTheASPNETWebAPI.aspx

De Ploeh:

GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
    t => this.container.Kernel.HasComponent(t) ?
        this.container.Resolve(t) :
        null,
    t => this.container.ResolveAll(t).Cast<object>());

Le ci-dessus doit être effectuée dans le monde.asax

0voto

timothyclifford Points 1641

Espérons que cela aide quelqu'un d'autre...

J'ai eu le même problème et c'était à moi le mouvement de la classe responsable de l'enregistrement de l'assemblée en charge de l'initialisation des contrôleurs. Déplacé hors de web dans le cadre du projet.

À l'aide de Autofac mais en serait de même pour d'autres conteneurs.

A l'appel de:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

Qui fonctionne très bien quand il est à l'intérieur de l'application web, mais a jeté au-dessus d'exception lors d'un déplacement à projet de cadre d'exécution de l'assemblée ne contient plus les contrôleurs.

Lieu de mise à jour:

builder.RegisterApiControllers(Assembly.GetCallingAssembly());

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