Как в Ninject 2.0 получить как общую привязку, так и привязку для конкретного случая?

У меня ситуация, когда я хочу, чтобы зависимость внедрила мой объект пользователя, но также поместила текущего пользователя в контейнер IoC. Я хочу, чтобы работали следующие строки:

kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user

Можно подумать, что такие привязки будут работать:

Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");

Конечно, это дает:

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.

Я понимаю ошибку, поскольку именованная привязка не ограничивает применение этой привязки, поэтому применяются обе привязки. Кажется очевидным, что мне нужно использовать контекстную привязку с. When * (), но я не могу придумать способ сделать это. Я чувствую, что должны быть методы, определяющие, применяется ли именованный экземпляр. Что-то вроде:

// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");

Я не могу найти места в интерфейсе IRequest или его свойствах, которые сообщают мне запрошенное имя. Как мне это сделать?

8
задан Cœur 28 June 2018 в 11:52
поделиться