Powiedzmy, że mam klasę o nazwie PermissionManager, która powinna istnieć tylko raz dla mojego systemu i zasadniczo spełnia funkcję zarządzania różnymi uprawnieniami dla różnych akcji w mojej aplikacji. Teraz mam pewne klasy w mojej aplikacji, które muszą być w stanie sprawdzić pewne uprawnienia w jednej z jego metod. Ten konstruktor klasy jest obecnie publiczny, tzn. Używany przez użytkowników API.Practical Singleton & Dependency Injection question
Aż kilka tygodni temu, chciałbym mieć po prostu miał moja klasa wywołać następujące pseudo-kod gdzieś:
PermissionManager.getInstance().isReadPermissionEnabled(this)
Ale odkąd zauważyli wszyscy tutaj nienawidząc singletons + ten rodzaj sprzęgła, byłem zastanawiając się, jakie byłoby lepsze rozwiązanie, ponieważ argumenty, które czytałem przeciwko singletonom, wydają się mieć sens (nie do sprawdzenia, wysokie sprzężenie itp.).
Czy rzeczywiście powinienem wymagać od użytkowników interfejsu API przekazania instancji PermissionManager w konstruktorze klasy? Mimo że chcę, aby dla mojej aplikacji istniała tylko jedna instancja PermissionManager?
Czy mam zamiar o tym wszystkim źle i powinien mieć niepubliczne konstruktora i fabryka gdzieś, które przechodzi w instancji PermissionManager dla mnie?
Dodatkowe informacje Zauważ, że kiedy mówię „Dependency Injection”, mówię o DI Pattern ... Nie używam żadnych ram DI jak Guice lub wiosną. (... jeszcze)
Punkt dotyczący wstrzykiwania za pośrednictwem interfejsu jest bardzo ważny. Możliwość wyśmiewania obiektu PermissionManager w testach sprawia, że DI jest potężnym podejściem do testowania kodu. –
co jeśli menedżer PermissionManager ma zależność. Czy istnieje mniej dziwny sposób niż PermissionManager.getInstance (Foo)? ? –