2010-07-22 13 views
5

Próbuję powiązać dwie konkretne klasy z jednym interfejsem. Jakiej komendy powinienem użyć w Ninject, aby to zrobić? Co próbuję zrobić, to powiązać dwie konkretne klasy z jedną bazą interfejsu w nazwie kontrolera. Czy to jest możliwe? Przypuszczam, że w ninjectu użyjesz opcji .Kiedy dajesz warunkowy, ale nie ma tam samouczka, który pokazuje, jak użyć tego. Kiedy jest koniec.Ninject do wiązania na różnych kontrolerach

Odpowiedz

8

Oto kilka przykładów. Sprawdź projekt źródłowy Ninject i jego podprojekt Testy dla różnych próbek użycia, to najlepsza dokumentacja dla niego, zwłaszcza, że ​​dokumenty nie zostały jeszcze zaktualizowane dla wersji 2.

// usage of WhenClassHas attribute 
Bind<IRepository>().To<XmlDefaultRepository>().WhenClassHas<PageAttribute>().WithConstructorArgument("contentType", ContentType.Page); 
// usage of WhenInjectedInto 
Bind<IRepository>().To<XmlDefaultRepository>().WhenInjectedInto(typeof(ServicesController)); 
Bind<IRepository>().To<XmlDefaultRepository>().WhenInjectedInto(typeof(PageController)).WithConstructorArgument("contentType", ContentType.Page); 
Bind<IRepository>().To<XmlDefaultRepository>().WhenInjectedInto(typeof(WidgetZoneController)).WithConstructorArgument("contentType", ContentType.WidgetZone); 
// you can also do this 
Bind<IRepository>().To<PageRepository>().WhenInjectedInto(typeof(PageController)).WithConstructorArgument("contentType", ContentType.Page); 
Bind<IRepository>().To<WidgetZoneRepository>().WhenInjectedInto(typeof(WidgetZoneController)).WithConstructorArgument("contentType", ContentType.WidgetZone); 
// or this if you don't need any parameters to your constructor 
Bind<IRepository>().To<PageRepository>().WhenInjectedInto(typeof(PageController)); 
Bind<IRepository>().To<WidgetZoneRepository>().WhenInjectedInto(typeof(WidgetZoneController)); 
// usage of ToMethod() 
Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current)); 

HTH

+0

staram polecenia WhenInjectedInto(), ale nadal nie działa dla mnie. Jeśli twój kontroler ma parametry, czy naprawdę potrzebujesz dodać WithConstructorArgument()? – Ganator

+0

Nie kontroler ma tylko konstruktor, który przyjmuje IRepository, ale implementacja IRepository (w moim przypadku XmlDefaultRepository) ma konstruktora, który przyjmuje parametr contentType typu string, do czego służy przykład z funkcją WithConstructorArgument(). – mare

+0

Uwaga - te metody When ...() i With ...() mogą być przenoszone łańcuchowo, można zatrzymać na WhenInjectedInto(). I, tak, WhenInjectedInto() działa dla mnie po wyjęciu z pudełka, bardzo proste, pod warunkiem, że implementacja twojego schematu repozytorium jest również prosta. Możesz napisać kod do interfejsu repozytorium i jego implementację i zobaczmy. Również wpisz kod z global.asax.cs, gdzie konfigurujesz DI. – mare

Powiązane problemy