2010-09-09 4 views
8

Mam sytuację, w której chcę uzależnić wstrzyknąć mój obiekt użytkownika, ale również umieścić bieżącego użytkownika w kontenerze IoC. Chcę się następujące wiersze do pracy:W programie Ninject 2.0, w jaki sposób mam zarówno ogólne powiązanie, jak i powiązanie dla konkretnej sprawy?

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

Można by pomyśleć Wiązania jak to będzie działać:

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

oczywiście, że daje:

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.

Rozumiem błąd ponieważ Powiązanie nazwane nie ogranicza zastosowania tego powiązania, więc oba wiązania mają zastosowanie. Wydaje się oczywiste, że muszę użyć kontekstowego powiązania z metodami .When *(), ale nie mogę wymyślić, jak to zrobić. Czuję, że powinny istnieć metody, które wykrywają, czy nazwana instancja jest stosowana. Coś jak:

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

nie mogę znaleźć żadnego miejsca na interfejsie IRequest czy to właściwości, które mi mówi żądanej nazwy. Jak mam to zrobic?

Odpowiedz

3

To pytanie zostało answerd na listę mailingową: http://groups.google.com/group/ninject/browse_thread/thread/cd95847dc4dcfc9d?hl=en


Jeśli dostęp użytkownika poprzez wywołanie dostać się na jądra (co mam nadzieję, że nie) to daj pierwszego wiązania nazwy jako dobrze i dostęp do użytkownika zawsze według nazwy. W rzeczywistości istnieje sposób na pobranie instancji z wiązania bez nazwy. Ale ponieważ gorąco zalecam, aby tego nie robić, nie pokazuję tego tutaj. Jeśli nadal chcesz to zrobić w ten sposób, powiem ci później, jak to zadziała.

Jeśli robisz to na lepsze i preferowany sposób i wstrzyknąć użytkownika do obiektów, które wymagają go jako zależność istnieją dwie opcje:

  1. Łatwiej jeden: Podaj pierwszy wiążącą nazwę i dodaj nazwany atrybut do parametrów np konstruktor ([Nazwany ("NewUser") IUser newuser [Nazwany ("Current")] IUser CurrentUser)
  2. Albo preferowana droga zachować klasy implementacji bezpłatne ram IoC: Określ atrybuty niestandardowe i dodaj je do parametrów np ctor ([NewUser] IUser newUser, [CurrentUser] IUser currentUser). Zmień Wiązania do:

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

przepraszam za długą zwłokę w odpowiedzi, nie mogę zrobić żadnej z nich, ponieważ, gdy nowy użytkownik jest wniosek, że dzieje się za pośrednictwem NHibernate. Nie mogę więc dodać nazwy ani atrybutu do tego. Mógłbym w przypadkach, w których chcę bieżącego użytkownika, ale wtedy nadal obowiązywałoby nowe powiązanie użytkownika. –

Powiązane problemy