2010-09-09 4 views
8

У меня есть ситуация, когда я хочу, чтобы пользователь вводил мой объект пользователя, но также размещал текущего пользователя в контейнере 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 или его свойство, что говорит мне имя запрошенное. Как мне это сделать?

ответ

3

Этот вопрос был answerd в списке рассылки: http://groups.google.com/group/ninject/browse_thread/thread/cd95847dc4dcfc9d?hl=en


Если вы обращаетесь к пользователю по телефону Получить на ядро ​​(я надеюсь, что вы не), а затем дать первый обязывающее имя, ну и доступ к пользователю всегда по имени. Фактически, есть способ получить экземпляр из привязки без имени. Но, потому что я сердечно рекомендую не делать этого, я не показываю, как к этому здесь. Если вы все еще хотите это сделать, я расскажу вам позже, как это будет работать.

Если вы делаете это лучше и предпочтительный способ и ввести пользователя к объектам, которые требуют его как зависимость есть два варианта:

  1. Чем проще один: Дайте первое обязывающее имя и добавьте именованный атрибут к параметрам, например т е р ([Названный ("NEWUSER") IUser NEWUSER, [Названный ("Current")] IUser CurrentUser)
  2. Или Предпочитаемый способ держать классы реализации свободных рамок IoC: Укажите пользовательские атрибуты и добавить их к параметрам, например ctor ([NewUser] IUser newUser, [CurrentUser] IUser currentUser). Изменение привязки к:

    Bind<User>().ToSelf() 
          .WhenTargetHas<NewUserAttribute>(); 
    Bind<User>().ToMethod(LoadCurrentUser) 
          .InRequestScope() 
          .WhenTargetHas<CurrentUserAttribute>(); 
    
+0

Извините за длительную задержку в ответ, я не могу сделать что-либо из них, потому что, когда новый пользователя запрашиваются, что происходит через NHibernate. Поэтому я не могу добавить к нему имя или атрибут. Я мог бы в тех случаях, когда я хочу текущего пользователя, но тогда будет применяться новая привязка пользователя. –

Смежные вопросы