У меня есть ситуация, когда я хочу, чтобы пользователь вводил мой объект пользователя, но также размещал текущего пользователя в контейнере IoC. Я хочу, чтобы следующие строки для работы:В Ninject 2.0, как у меня есть как общая привязка, так и привязка для specfic case?
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
или его свойство, что говорит мне имя запрошенное. Как мне это сделать?
Извините за длительную задержку в ответ, я не могу сделать что-либо из них, потому что, когда новый пользователя запрашиваются, что происходит через NHibernate. Поэтому я не могу добавить к нему имя или атрибут. Я мог бы в тех случаях, когда я хочу текущего пользователя, но тогда будет применяться новая привязка пользователя. –