2014-07-24 5 views
0

Je veux créer une instance de PerRequestResourceProvider en utilisant InRequestScope ninject:ASP.NET MVC + Ninject: InRequestScope

public class PerRequestResourceProvider: IPerRequestResourceProvider 
{ 
    priavte readonly _perRequestResorceInstance; 
    public PerRequestResourceProvider() 
    { 
     _perRequestResorceInstance = new PerRequestResource(); 
    } 
    public PerRequestResource GetResource() 
    { 
     return _perRequestResorceInstance; 
    } 
} 

public interface IPerRequestResourceProvider 
{ 
    PerRequestResource GetResource(); 
} 

Dans mon NinjectDependencyResolver:

..... 
kernel.Bind<IPerRequestResourceProvider>.To<PerRequestResourceProvider>().InRequestScope(); 

J'injectent IPerRequestResourceProvider dans quelques classes. Mais lorsque j'ajoute un point d'arrêt au constructeur PerRequestResourceProvider, je vois que PerRequestResourceProvider est créé trois fois au cours d'une requête et non par requête. Qu'est-ce qui ne va pas?

Mise à jour: code source: TTP //bitbucket.org/maximtkachenko/ninjectinrequestscope/src

+0

Si c'est le cas, vous devriez publier un échantillon minimal - mais complet - qui reproduit le problème. Pour que nous/vous puissiez créer un rapport de bug @ ninject ou vous aider à résoudre le problème. Vous pouvez créer une solution minimale, la télécharger et la lier. – BatteryBackupUnit

+0

@BatteryBackupUnit J'ai ajouté le code source https://bitbucket.org/maximtkachenko/ninjectinrequestscope/src – mtkachenko

+0

@BatteryBackupUnit J'ai corrigé le con- ducteur HomeController mais le résultat est le même: Le constructeur PerRequestResourceProvider est appelé 3 fois pendant la requête. – mtkachenko

Répondre

0

Il y a deux problèmes avec votre code:

  1. Ninject ne s'initialisés correctement. Vous avez besoin d'un des packages Ninject.MVCx (selon la version MVC que vous utilisez). Pour le configurer correctement, voir: http://github.com/ninject/ninject.web.mvc

  2. Vous injectez PerRequestResourceProvider (le type de classe), et non IPerRequestResourceProvider (le type d'interface) dans HomeController, ainsi le .InRequestScope() défini sur la IPerRequestResourceProvider fixation ne prend aucun effet. Changez le constructeur HomeController pour obtenir le type d'inteface injecté et vous êtes bon.


Ninject ne nécessite pas de fixations pour les classes instanciable (non abstraites, ..). C'est pourquoi il n'est pas évident quand la mauvaise liaison est utilisée.

Questions connexes