Po prostu załóżmy, że mam klasę Foo, która ma dwie zależności: ISerializer<T>
i IFileAccessHandler
.Nie można połączyć Factory/DI
Ta klasa ma również inne zależności, zależności funkcjonalne. Nie chcę, aby ktokolwiek tworzył tę klasę w niepoprawnym stanie, więc musiałbym przekazać obiekt domeny w konstruktorze.
Ale jak mogę to załatwić przez IoC, gdy wiem również, jaki obiekt domeny przekazać w momencie, w którym faktycznie tworzę klasę Foo?
Ustawiłem obiekt domeny jako własność ustawioną przez fabrykę. Dlatego Factory wykonuje wywołanie Service Locator, aby uzyskać prawidłowo utworzoną klasę "Foo" z jej zależnościami, a następnie wypełnia ją właściwym obiektem domeny i zwraca go.
Ale czy to najlepszy sposób, aby przejść? Wolałbym, aby obiekt domeny był częścią mojego konstruktora, aby był on faktycznie zgodny z "Foo".
Wszelkie pomysły? Czy tu czegoś brakuje?
Dlaczego tworzysz Foo ręcznie? W takim przypadku FooFactory ma niepotrzebne zależności. Dlaczego nie używasz container.Resolve (dc) zamiast nowego Foo (this.serializer, this.fileHandler, dc)? –
Ponieważ byłby to anty-wzór usługi Locator (http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx).Kontener DI nie może zaatakować reszty aplikacji. Jednak niektóre kontenery (np. Windsor) mogą automatycznie implementować i emitować implementacje abstrakcyjnych fabryk, w którym to przypadku FooFactory będzie całkowicie nadmiarowy. Jeśli chcesz korzystać z pojemnika DI, przejdź całą drogę :) –
Zgadzam się, że usługa Lokalizator ma charakter zapobiegawczy, ale każda reguła ma wyjątki. Nie powinieneś stosować się do tej reguły na ślepo! Drutujesz swoje obiekty ręcznie, twoja abstrakcyjna fabryka ma nieprawidłowe zależności. To zapach złego projektu, prawda? Pojemnik DI ma na celu pozbycie się tego zapachu, prawda? Użyj kontenera DI, aby utworzyć Foo! Masz rację :) Jeśli chcesz korzystać z pojemnika DI, przejdź całą drogę :) –