I'd like to do something like this:
ConcreteClass foo = ninject2.Get<ConcreteClass>(
new ConstructorArgument("bar", "qux"));
ninject2.Bind<ConcreteClass>().ToConstant(foo);
...
ConcreteClass foo = ninject2.Get<ConcreteClass>(); // fail!
When I try, I get the error Error activating ConcreteClass. More than one matching bindings are available.
What is happening here?
OOTB, Ninject (esp. v2 - in v1, it was an optional setting that defaulted to on) internally generates implicit bindings for concrete classes to themselves, with the default scoping (Transient in v2). These registrations get added into the Bindings list as if you'd added them yourself via.
If you need anything different in your binding, you register a
Bind
ing before it gets auto-bound, with Your customisation bit a la:In this case, your remedy is to use something like:
Where
InSingletonScope()
would match your current code in that it looks like you only ever want to instantiate one. In general, as covered in other answers, one shouldnt necessarily grab forInSingletonScope
as a tool of first resort.