Ninject-ing une dépendance Mondiale.asax
Je suis le démarrage d'une application web avec MVC3 et Ninject. Il y a une dépendance que j'ai aussi besoin dans le monde.asax fichier qui doit être un singleton.
J'ai pensé qu'il devrait être comme ceci:
public class MvcApplication : NinjectHttpApplication
{
IUserAuthentication _auth;
public MvcApplication()
{
base.AuthenticateRequest += new EventHandler(MvcApplication_AuthenticateRequest);
}
protected override IKernel CreateKernel()
{
var _kernel = new StandardKernel(new SecurityModule());
_auth = _kernel.Get<IUserAuthentication>();
return _kernel;
}
void MvcApplication_AuthenticateRequest(object sender, EventArgs e)
{
_auth.ToString();
}
Mais ensuite j'ai vu que _auth
est nulle lorsque l' MvcApplication_AuthenticateRequest
est appelé.
Ensuite, j'ai essayé comme ceci:
public class MvcApplication : NinjectHttpApplication
{
ItUserAuthentication _auth;
IKernel _kernel;
public MvcApplication()
{
_kernel = new StandardKernel(new SecurityModule());
_auth = _kernel.Get<IUserAuthentication>();
base.AuthenticateRequest += new EventHandler(MvcApplication_AuthenticateRequest);
}
protected override IKernel CreateKernel()
{
return _kernel;
}
void MvcApplication_AuthenticateRequest(object sender, EventArgs e)
{
_auth.ToString();
}
Mais maintenant, je peux voir que le constructeur est appelé plusieurs fois, donc je vais avoir plusieurs IKernel, et je suppose que singleton cas ne sera pas si singleton dans mon application.
Comment dois je faire? Utilisation d'une variable statique?
OriginalL'auteur vtortola | 2011-04-01
Vous devez vous connecter pour publier un commentaire.
C'est comment nous le faisons, j'ai fait quelques tests et mon AuthService semble aller dans son contrôleur qu'une seule fois :
Espère que cela aide!
Je ne le pense pas, @Remo devrait être en mesure de vous en dire plus que moi, mais depuis que j'ai injecter mon _authService dans la plupart de mon contrôleur dans le constructeur il probablement faire la même chose et ne pas le "coût" que mutch...
grand. Je pense que cela va faire jusqu' @Remo résoudre le problème. Merci un million.
content que ça aide, mon plaisir 🙂
OriginalL'auteur VinnyG
Le MVC extension injecte le HttpApplication par défaut. Mais seulement la propriété d'injection peut être utilisé! Donc, il suffit d'ajouter une propriété décorée avec les Injecter de l'attribut.
êtes-vous à l'aide de la dernière version de Ninject Mvc3? La propriété devrait ressembler à ceci: [Injecter] public ItUserAuthentication Auth { get; set; }
J'ai eu "Ninject.Web.Mvc3-2.2.1.0-release-net-4.0.zip" je pense que c'est la dernière version. J'ai essayé et ça ne fonctionne pas
J'ai eu un coup d'oeil au code. Avec l'introduction du package NuGet cette fonctionnalité a été brisé. Comme je suis en train de mettre à jour les packages NuGet de toute façon à 1.2 NuGet, je vais corriger cela dans les jours à venir.
Z l'Injection d'un objet avec la durée de vie d'une requête dans un objet qui a une plus longue durée de vie n'a pas de sens. Un objet ne doit dépendre des objets avec le même ou un cycle de vie plus long.
OriginalL'auteur Remo Gloor
Déplacer le code du constructeur de
Application_Start
méthode. Je crois que même si plusieurs HttpApplication des instances sont créées, Application_Start est appelée qu'une seule fois, et que trop sur la 1ère instance. Laissez-moi savoir si cela a résolu votre problème.Ce sont les différents gestionnaires d'événements vous pouvez potentiellement avoir dans votre Global.asax.cs :
OriginalL'auteur Zasz
Pouvez-vous utiliser le HttpApplication.Appliction propriété?
OriginalL'auteur John Wathen