Używam zamku Windsor już od jakiegoś czasu. Jest idealny do środowisk, w których dane znajdują się w bazie danych lub tym podobnych, gdzie wzór repozytorium lub wzorzec unitofwork działają dobrze.Zamek Windsor/DI i modele obiektów
Teraz mam inną sytuację: mam złożony model obiektu, który jest składany przez wiele pojedynczych PONO. Środowisko jest pod silnym wpływem COM, aby było bardziej wyraźne: Excel, Word PIO są mocno wykorzystywane.
Używam wzorca polecenia, zaimplementowałem ICommandHandler jak opisano here, ale z jedną różnicą. Ponieważ chcę składać polecenia do listy poleceń, aby wywoływać je w biegu, nie wiedząc nic oprócz opisanego ogólnego wzorca poleceń, nie wprowadza on kontekstu podczas wywoływania metody execute. Interfejs wygląda następująco:
public interface ICommand
{
void Execute();
bool CanExecute();
}
Wykonywanie poleceń za pomocą tego interfejsu jest skuteczne i łatwe do zrozumienia. Z drugiej strony problemem jest wprowadzenie kontekstu z ctor, ponieważ dlatego pojemnik musi być wyraźnie nazwany na przykład dodaj parametry ctor.
Więc faktycznie mają dwa pytania:
- Czy to możliwe, aby wstrzyknąć - nazwijmy to kontekst, część modelu obiektowego - automatycznie przez zamku Windsor bez wywoływania pojemnik explictely?
- Jak wziąć udział w strukturze poleceń za pomocą DI? Wszelkie pomysły, jak osiągnąć możliwość definiowania listy zadań/działań lub tym podobnych, zgodnie z regułą RRR opisaną jako here?
Łącze do opisu wzorca komend/obsługi (używając 'ICommandHandler'), ale w rzeczywistości używasz wzorca polecenia, który jest zupełnie inny, ponieważ polecenia w komendzie/wzorze obsługi są DTO bez zachowania, i nie zawierają żadnej metody "Execute". Posiadanie na nich metody 'Execute' wyłącza większość możliwości, jakie przynosi wzór poleceń/obsługi. Problemy z wstrzykiwaniem zależności do poleceń znikną, gdy wstrzykniesz zależności do procedur obsługi. W komendzie/procedurze obsługi komendy nie mają żadnych zależności (ponieważ nie mają żadnego zachowania). –
Steven
Dzięki za odpowiedź, Steven. Na pewno masz rację, mogę wprowadzić je do obsługi. Ale to nie rozwiązuje problemu, ponieważ wciąż muszę wstrzykiwać te same informacje i wywoływać kontener, aby moje dane były dostępne dla handler'a. Nie byłoby możliwe wykonywanie poleceń wsadowych i wykonywanie ich w wierszu. Czy coś złego? –