Ошибка «Несколько привязок» при вызове ninject2.Get <ConcreteClass>() - PullRequest
1 голос
/ 23 августа 2010

Я бы хотел сделать что-то вроде этого:

ConcreteClass foo = ninject2.Get<ConcreteClass>(
    new ConstructorArgument("bar", "qux"));

ninject2.Bind<ConcreteClass>().ToConstant(foo);

...

ConcreteClass foo = ninject2.Get<ConcreteClass>(); // fail!

При попытке получить сообщение об ошибке Error activating ConcreteClass. More than one matching bindings are available.

Что здесь происходит?

1 Ответ

0 голосов
/ 23 августа 2010

OOTB, Ninject (особенно v1 - в v1 это был необязательный параметр, который по умолчанию включен) внутренне генерирует неявные привязки для конкретных классов к себе, с областью видимости по умолчанию (Transient в v2).Эти регистрации будут добавлены в список «Привязки», как если бы вы добавили их самостоятельно.

Bind<ConcreteClass>().ToSelf(); // .InTransientScope(); -- But that would be implicit

Если вам нужно что-то другое в вашей привязке, вы регистрируете Bind, прежде чем она будет автоматически привязана,с Ваш бит настройки a la:

Bind<ConcreteClass>().ToSelf().<<Your Customisation Bit>>;

В этом случае ваше средство защиты должно использовать что-то вроде:

Bind<ConcreteClass>().ToSelf().InSingletonScope().WithConstructorArgument( "foo", "bar");

Где InSingletonScope() будет соответствовать вашемутекущий код в том, что он выглядит так, как будто вы когда-либо хотите создать его экземпляр.В общем, как показано в других ответах, не обязательно обязательно брать InSingletonScope как средство первой инстанции.

...