Ninject: Singleton syntaxe de liaison?
Je suis en utilisant Ninject 2.0 pour la .Net framework 3.5. J'ai du mal avec singleton de liaison.
J'ai une classe UserInputReader
qui implémente IInputReader
. Je veux seulement une instance de cette classe jamais créé.
public class MasterEngineModule : NinjectModule
{
public override void Load()
{
//using this line and not the other two makes it work
//Bind<IInputReader>().ToMethod(context => new UserInputReader(Constants.DEFAULT_KEY_MAPPING));
Bind<IInputReader>().To<UserInputReader>();
Bind<UserInputReader>().ToSelf().InSingletonScope();
}
}
static void Main(string[] args)
{
IKernel ninject = new StandardKernel(new MasterEngineModule());
MasterEngine game = ninject.Get<MasterEngine>();
game.Run();
}
public sealed class UserInputReader : IInputReader
{
public static readonly IInputReader Instance = new UserInputReader(Constants.DEFAULT_KEY_MAPPING);
//...
public UserInputReader(IDictionary<ActionInputType, Keys> keyMapping)
{
this.keyMapping = keyMapping;
}
}
Si je le constructeur privé, il se casse. Ce que je fais mal?
Quelques variations intéressantes sur les singletons: yoda.arachsys.com/csharp/singleton.html
Vous pouvez faire le constructeur interne au lieu de privé si elles sont dans la même assemblée. Peut-être que des annonces un peu de sécurité, si vous êtes préoccupé par le code des autres assemblées accéder à ce constructeur.
Vous pouvez faire le constructeur interne au lieu de privé si elles sont dans la même assemblée. Peut-être que des annonces un peu de sécurité, si vous êtes préoccupé par le code des autres assemblées accéder à ce constructeur.
Bind<IInputReader>().To<UserInputReader>().InSingletonScope()
OriginalL'auteur Nick Heiner | 2010-04-05
Vous devez vous connecter pour publier un commentaire.
Bien sûr, il se casse si vous faites le constructeur privé. Vous ne pouvez pas appeler les constructeurs privés venant de l'extérieur de la classe!
Ce que vous faites est exactement ce que vous êtes censé faire. Test:
Vous n'avez pas besoin du champ statique pour obtenir l'instance du singleton. Si vous utilisez un conteneur IoC, vous devriez obtenir tous vos instances à travers le récipient.
Si vous ne veulent que le public de champ statique (pas sûr si il y a une bonne raison à cela), vous pouvez lier le type de sa valeur, comme ceci:
MODIFIER: Pour spécifier le
IDictionary<ActionInputType, Keys>
à utiliser dans le constructeur deUserInputReader
, vous pouvez utiliser leWithConstructorArgument
méthode:IDictionary<enum, enum>
. Comment puis-je le préciser dans Ninject?soit vous créez un marqueur wrapper autour du dictionnaire, de l'appeler
IActionKeyMap
ou quelque chose, et de l'utiliser, ou vous pouvez utiliser la méthode d'approche dans votre commentaire, ou à vous d'utiliser les installations de spécifier ctor paramètres (ne me souviens pas exactement comment faire :(.Eu:
.WithConstructorArgument("keyMapping", /* whatever */);
Est-il une syntaxe de ligne de faire
ninject.Get<IInputReader>().DoSomething()
tout comme l'OP voulait faire avecUserInputReader.Instance.DoSomething()
OriginalL'auteur R. Martinho Fernandes
IInputReader ne déclare pas le champ d'Instance ne peut, depuis les interfaces ne peuvent pas avoir de champ ou champ statique ou même des propriétés statiques (ou méthodes statiques).
La Lier la classe ne peut pas savoir qu'il est de trouver le champ d'Instance (sauf s'il utilise la réflexion).
OriginalL'auteur Danny Varod