Accès au noyau Ninject dans le monde
Cette question n'est pas spécifiquement liée à Ninject. C'est plus un général de codage question, mais je vais le poster ici au cas où il pourrait y avoir une meilleure façon entièrement de traitement de la question dans Ninject, que ce que je suis en train de faire.
Je voudrais savoir si il est possible d'accéder à la Ninject Noyau Standard à l'échelle mondiale, de son instance Mondiale.asax.
Voici le code:
public class MvcApplication : NinjectHttpApplication
{
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
//MVC global registration, routing and filtering code goes here...
}
protected override IKernel CreateKernel()
{
return Container;
}
private static IKernel Container
{
get
{
IKernel kernel = new StandardKernel();
kernel.Load(new ServiceModule(), new RepositoryModule());
return kernel;
}
}
}
Si j'ai certaines classes, par exemple, à la façade classes qui ne soient pas en contact avec les contrôleurs, où je voudrais, pour commencer une chaîne de dépendances, ma compréhension est que je devrais utiliser:
_className = kernel.Get<IClassName>();
Toutefois, la seule façon que je connaisse pour faire cela est de créer une nouvelle instance de la Ninject noyau Standard, mais si je comprends bien, n'est pas une bonne idée de créer une nouvelle instance de la Ninject noyau, parce que c'est essentiellement la création d'un deuxième noyau.
Donc, est-il possible d'accéder au Noyau existant qui a été créé en Mondial de.asax au Démarrage de l'Application, à partir de n'importe où dans ma demande, ou est-il une meilleure façon entièrement pour ce faire?
Ce qui concerne,
Fred Chateau
source d'informationauteur Fred Chateau
Vous devez vous connecter pour publier un commentaire.
Le moyen le plus simple (OMI):
Version plus récente de Ninject a cette méthode si elle est utilisée avec le Système.Web.MVC:
var obj = DependencyResolver.Current.GetService<IClassName>();
Sauf si vous avez besoin de manipuler DI liaisons à la volée, mais l'instanciation d'un StandardKernel est un peu lourd.
IKernel kernel = new StandardKernel();
var obj = DependencyResolver.Current.GetService<IClassName>();
J'ai réussi à obtenir le Service Localisateur de travail, et il semble fonctionner assez bien. Lorsqu'une demande arrive dans l'application par l'intermédiaire d'un Contrôleur MVC Méthode d'Action, Ninject fonctions normalement fournis par Ninject.Mvc.Extensions. Il injecte de l'instance en cours à travers le contrôleur de constructeur. Lorsqu'une demande arrive dans l'application de toute autre manière, j'appelle le Service Locator pour l'alimentation de l'instance de classes dans les classes de constructeur.
Voici le code:
Tout d'abord, une référence à Microsoft.Les pratiques.ServiceLocation
Et suivants Ninject adaptateur classe.
Et Mondiale.asax
Note ce code nécessite l'utilisation de Ninject.Mvc.Les Extensions, qui fournit la résolution de dépendances de secours pour le contrôleur par défaut. Sinon, une coutume de résolution de dépendances peuvent être nécessaires.
Cela semble résoudre tous mes préoccupations. Il crée les classes d'instance, décide l'ensemble de l'objet graphique, et fonctionne à partir de n'importe où j'en ai besoin pour travailler. Et, autant que je peux dire, il y a un seul Ninject Noyau Standard par application.
Je sais en utilisant le Localisateur de Service modèle est mal vu, mais j'imagine à l'aide de plus d'un noyau Ninject serait mal vu pire.
Fred Chateau
On dirait que tu as besoin de plus d'un modèle de Fabrique de la mise en œuvre de Ninject. Vous pourrait migrer le Noyau de la Mondiale.asax pour une Usine de classe qui pourraient être en interaction avec le reste de votre application.
Sinon, si vous avez une situation où un paramètre spécifié au moment de l'exécution est de déterminer l'interface de liens que vous pouvez rassembler le service. C'est un hybride de configuration de DI et ServiceLocater, mais le ServiceLocater se produit uniquement au niveau du service de l'instanciation, toutes les autres couches sont codées, normalement, dans un DI/CIO modèle.