J'ai une situation où je veux dépendance injecter mon objet utilisateur, mais aussi placer l'utilisateur actuel dans le conteneur IoC. Je veux que les lignes suivantes pour:Dans Ninject 2.0, comment ai-je une liaison générale et une liaison pour un cas particulier?
kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user
On pourrait penser consolidations comme celui-ci travailleraient:
Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");
Bien sûr, cela donne:
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.
Je comprends l'erreur depuis une La liaison nommée ne limite pas l'application de cette liaison, les deux liaisons s'appliquent donc. Il semble clair que j'ai besoin d'utiliser le bind contextuel avec les méthodes .When *() mais je ne peux pas trouver un moyen de le faire. Je me sens comme il devrait y avoir quand les méthodes qui détectent si une instance nommée est appliquée. Quelque chose comme:
// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");
Je ne peux pas trouver un endroit sur l'interface IRequest
ou ses propriétés qui me dit que le nom demandé. Comment puis-je faire cela?
Désolé pour le long retard dans la réponse, je ne peux pas le faire parce que l'une de ces lorsqu'un nouvel utilisateur est demandée, ce qui se passe par NHibernate. Donc je ne peux pas ajouter un nom ou un attribut à cela. Je pourrais dans les cas où je veux l'utilisateur actuel, mais alors la nouvelle liaison d'utilisateur s'appliquerait toujours. –