Servis Bulucu, tabiri caizse iki kötülükten daha azıdır. Bu dört farklılığa indirgenen "daha az" ( en azından şu anda başkalarını düşünemiyorum ):
Tek Sorumluluk İlkesi
Hizmet Konteyneri, Singleton'ın yaptığı gibi Tek Sorumluluk İlkesini ihlal etmez. Singletons, nesne oluşturma ile iş mantığını karıştırırken, Hizmet Konteyneri, uygulamanızın nesne yaşam döngülerini yönetmekten kesinlikle sorumludur. Bu bakımdan Servis Konteyneri daha iyidir.
Kaplin
Statik yöntem çağrıları nedeniyle genellikle uygulamanıza tekil kodlar eklenir, bu da kodunuzda sıkı bağlı ve alay edilmesi zor bağımlılıklara yol açar . Öte yandan SL sadece bir sınıftır ve enjekte edilebilir. Yani, tüm sınıflandırmalarınız buna bağlı olsa da, en azından gevşek bağlı bir bağımlılıktır. Dolayısıyla, ServiceLocator'ı tek başına bir Singleton olarak uygulamadıysanız, bu biraz daha iyi ve test etmesi daha kolay.
Bununla birlikte, ServiceLocator'ı kullanan tüm sınıflar artık aynı zamanda bir bağlantı biçimi olan ServiceLocator'a bağlı olacaktır. Bu, ServiceLocator için bir arabirim kullanarak hafifletilebilir, böylece somut bir ServiceLocator uygulamasına bağlı kalmazsınız, ancak sınıflarınız bir tür Konum Belirleyicinin varlığına bağlı olurken, bir ServiceLocator kullanmamak, yeniden kullanımı önemli ölçüde artırır.
Gizli Bağımlılıklar
Bağımlılıkları gizleme sorunu çok fazla var. Yer belirleyiciyi tüketen sınıflarınıza enjekte ettiğinizde, herhangi bir bağımlılık bilemezsiniz. Ancak Singleton'ın aksine, SL genellikle perde arkasında ihtiyaç duyulan tüm bağımlılıkları somutlaştıracaktır. Dolayısıyla, bir Hizmeti aldığınızda , CreditCard örneğindeki Misko Hevery gibi olmazsınız , örneğin, bağımlılıkların tüm bağımlılıklarını elle başlatmanız gerekmez.
Bağımlılıkları örneğin içinden almak, ortak çalışanlara girmemeniz gerektiğini belirten Demeter Yasasını da ihlal ediyor. Bir örnek yalnızca en yakın işbirlikçileriyle konuşmalıdır. Bu, hem Singleton hem de ServiceLocator ile ilgili bir sorundur.
Küresel Durum
Küresel Durum problemi de bir şekilde hafifletilmiştir, çünkü testler arasında yeni bir Servis Bulucu başlattığınızda, daha önce yaratılan tüm örnekler de silinir (hatayı yapıp bunları SL'deki statik özniteliklere kaydetmediyseniz). Elbette bu, SL tarafından yönetilen sınıflarda herhangi bir küresel durum için geçerli değildir.
Ayrıca çok daha derinlemesine bir tartışma için Service Locator ve Dependency Injection'daki Fowler'a bakın .
Güncellemeniz ve Singletons kullanan kodun test edilmesiyle ilgili Sebastian Bergmann tarafından yazılan bağlantılı makale hakkında bir not : Sebastian, önerilen geçici çözümün Singleon'ları daha az sorun haline getirdiğini hiçbir şekilde önermiyor. Aksi takdirde daha fazla test edilebilirliği test etmek imkansız olacak olan kod yapmanın yalnızca bir yoludur. Ama yine de sorunlu bir kod. Aslında, açıkça şunu belirtiyor: "Sadece Yapabildiğin İçin, Yapman gerektiği anlamına gelmez".