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?
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. –