2010-10-06 17 views
5

Próbuję uzyskać wtrysk właściwości działający na atrybut filtru działania niestandardowego. Działa tak, jak powinno, jednak chciałbym użyć DI na samej własności. Mój filtr wygląda tak, jak ten Oto jak konfiguruję właściwość za pomocą StructureMap w mojej klasie BootStrapper.Włamanie właściwości do filtru działania

  //HeaderFilterAttribute 
     IMarketRepository marketRepository = new SqlMarketRepository(); 
     IMarketService marketService = new MarketService(marketRepository); 
     ObjectFactory.Container.Configure(r => r.ForConcreteType<HeaderFilterAttribute>(). 
              Configure.WithProperty("MarketService"). 
              EqualTo(marketService)); 

Moim problemem jest to, że nie mają dostępu do SqlMarketRepository ponieważ wszystkie moje konkretne typy są wstrzykiwane przez DI, a ja naprawdę nie chcesz używać konkretnych typów w moim inicjującego. Tak więc ostatecznym pytaniem jest, w jaki sposób mogę wstrzyknąć usługę MarketService do atrybutu filtra bez uciekania się do powyższych? :)

+0

Czy MVC 3 jest opcją? To jest wbudowane. –

+0

Muszę podjąć decyzję w ciągu miesiąca Craig i nie jestem pewien, czy zespół zatwierdzi wydanie wersji zapoznawczej do użytku produkcyjnego :( – Praveen

Odpowiedz

4

W swojej ObjectFactory.Initialize() połączenia, należy dodać następujący wiersz:

SetAllProperties(x => x.OfType<IMarketService>()); 

że wstrzyknie skonfigurowaną instancji IMarketService do jakiejkolwiek własności typu IMarketService, na dowolnym obiekcie pobierane z pojemnika.

+0

To jest dokładnie to, czego potrzebowałem. To jest po prostu niesamowite:) Dzięki Josh! – Praveen

1

Wydaje mi się, że potrzebna jest implementacja wywołania niestandardowego działania, która rozwiąże filtry. Możesz wykopać próbkę Windsor z mojej firmy implementation (około 1/2 drogi w dół). W Internecie powinno być więcej dostępnych. Wiem, że widziałem kilka na tej stronie.

PS. Zauważyłem, że używasz podstawowego modelu widoku do wypełnienia nagłówka. Zalecam używanie kolekcji ViewData [] z kluczem statycznym zamiast dziedziczenia w modelu widoku. :)

+0

Próbuję trzymać się z daleka od kolekcji ViewData, ile mogę: D. Czy jest jakiś powód, dla którego silny typ byłby w tym przypadku zły? – Praveen

+1

Ponieważ kompozycja (poprzez ViewData []) pozwala na większą elastyczność niż dziedziczenie modeli widoku. Wyobraź sobie, że później chcesz dodać więcej elementów (nagłówek, menu, pasek boczny, widżet profilu użytkownika itp.) Do różnych stron. Jeśli musisz dopasować to wszystko do swojego podstawowego modelu widoku, stanie się on zatłoczony i prawdopodobnie nie będziesz potrzebował wszystkiego w każdym widoku. Używam tego modelu wyłącznie do renderowania określonego widoku, a następnie umieszczam inne moje komponenty w ViewData. Przykładowy kod widoku: 'var headerModel = ViewData [Constants.HeaderData] jako HeaderViewModel'. – Ryan

Powiązane problemy