Ich habe eine Situation, in der ich mein Benutzerobjekt Abhängigkeit injizieren möchte, sondern auch den aktuellen Benutzer in den IoC-Container platzieren. Ich möchte die folgenden Zeilen arbeiten:In Ninject 2.0, wie habe ich sowohl eine allgemeine Bindung als auch eine Bindung für einen bestimmten Fall?
kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user
Man könnte denken, Bindungen wie dies funktionieren würde:
Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");
Natürlich, das gibt:
Ninject.ActivationException: Error activating User More than one matching bindings are available. Activation path: 1) Request for User Suggestions: 1) Ensure that you have defined a binding for User only once.
Ich verstehe den Fehler, da ein Benannte Bindung beschränkt nicht die Anwendung dieser Bindung, so dass beide Bindungen gelten. Es scheint klar zu sein, dass ich die kontextabhängige Bindung mit den .When *() Methoden verwenden muss, aber ich kann keine Möglichkeit finden, dies zu tun. Ich habe das Gefühl, dass es Methoden geben sollte, die erkennen, ob eine benannte Instanz angewendet wird. Etwas wie:
// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");
ich keinen Platz auf der IRequest
Schnittstelle finden kann oder es Eigenschaften, die mir den Namen angefordert erzählt. Wie mache ich das?
Sorry für die lange Verzögerung in der Reaktion, kann ich auch nicht davon, weil, wenn ein neuer Benutzer angefordert wird, dass durch NHibernate geschieht. Also kann ich keinen Namen oder ein Attribut hinzufügen. Ich könnte in den Fällen, wo ich den aktuellen Benutzer möchte, aber dann würde die neue Benutzerbindung immer noch gelten. –