2010-03-06 12 views
6

Mam klasę, która będzie musiała użyć wzorca projektowania strategii. W czasie pracy muszę przełączać i wyłączać różne algorytmy, aby zobaczyć wpływ na wydajność aplikacji.Strategia Wzór projektu z kontenerami IOC - Ninject specific

Dana klasa pobiera obecnie cztery parametry w konstruktorze, z których każdy reprezentuje algorytm.

Jak używać programu Ninject (lub podejścia uogólnionego), czy mogę nadal używać IOC, ale użyć wzorca strategii?

Obecne ograniczenie polega na tym, że moje jądro (kontener) jest świadome każdego interfejsu algorytmu, ale można go powiązać tylko z jedną konkretną klasą. Jedynym sposobem, jaki widzę w tym momencie, jest przejście przez wszystkie osiem algorytmów w budowie, ale używanie różnych interfejsów, ale wydaje się to całkowicie niepotrzebne. Nie zrobiłbym tego, gdybym nie używał kontenera IOC, więc musi być jakiś sposób obejścia tego.

przykładem Kod:

class MyModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<Person>().ToSelf(); 
     Bind<IAlgorithm>().To<TestAlgorithm>(); 
     Bind<IAlgorithm>().To<ProductionAlgorithm>(); 
    } 
} 

osoba musi skorzystać z obu algorytmów więc mogę przełączyć w czasie wykonywania. Ale tylko TestAlgorithm jest związany, ponieważ jest pierwszym w kontenerze.

Odpowiedz

6

Zróbmy krok do tyłu i zbadajmy nieco większy obraz. Ponieważ chcesz mieć możliwość przełączania strategii w czasie wykonywania, musi istnieć jakiś mechanizm sygnalizacyjny, który mówi osobie, aby przełączyła strategię. Jeśli aplikacja jest oparta na interfejsie użytkownika, być może istnieje przycisk lub lista rozwijana, w której użytkownik może wybrać strategię do użycia, ale nawet jeśli tak nie jest, część zewnętrznego wywołującego musi mapować kawałek danych bieżących do przykładu Strategii.

The standard DI solution when you need to map a run-time instance to a dependency is to use an Abstract Factory.

Zamiast rejestrować poszczególne strategie za pomocą kontenera, rejestruje się fabrykę.

Jest całkiem możliwe, aby napisać kompletny interfejs API, aby był to DI-friendly, but still DI Container-agnostic.

+0

To działało. Twoje zdrowie. – Finglas

3

Jeśli trzeba zmieniać realizację IAlgorithm w czasie wykonywania można zmienić Person wymagać algorytm fabrykę który zapewnia różne algorytmy oparte na konkretnych warunkach run-time.

Niektóre kontenery wtrysku zależnego umożliwiają wiązanie z anonimowymi delegatami kreacji - jeśli program Ninject obsługuje to, możesz umieścić logikę decyzji w jednym z nich.

Powiązane problemy