Ninject: Singleton binding syntax?

最后都变了- 提交于 2019-12-03 12:34:42

问题


I'm using Ninject 2.0 for the .Net 3.5 framework. I'm having difficulty with singleton binding.

I have a class UserInputReader which implements IInputReader. I only want one instance of this class to ever be created.

 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;
        }
}

If I make that constructor private, it breaks. What am I doing wrong here?


回答1:


Of course it breaks if you make the constructor private. You can't call private constructors from outside your class!

What you're doing is exactly what you're supposed to do. Test it:

var reader1 = ninject.Get<IInputReader>();
var reader2 = ninject.Get<IInputReader>();
Assert.AreSame(reader1, reader2);

You don't need the static field to get the instance singleton. If you're using an IoC container, you should get all your instances through the container.

If you do want the public static field (not sure if there is a good reason for that), you can bind the type to its value, like this:

Bind<UserInputReader>().ToConstant(UserInputReader.Instance);

EDIT: To specify the IDictionary<ActionInputType, Keys> to use in the constructor of UserInputReader, you can use the WithConstructorArgument method:

Bind<UserInputReader>().ToSelf()
     .WithConstructorArgument("keyMapping", Constants.DEFAULT_KEY_MAPPING)
     .InSingletonScope();



回答2:


IInputReader does not declare the Instance field nor can it, since interfaces can not have field or static field or even static properties (or static methods).

The Bind class can not know that it is to find the Instance field (unless it uses reflection).



来源:https://stackoverflow.com/questions/2581521/ninject-singleton-binding-syntax

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!