I am asking if this is a correct implementation of this pattern or is there a better way?
Non esattamente. Il localizzatore di servizi, in uno scenario ideale, non dipende da alcuna interfaccia: è solo un contenitore / mappa / fabbrica stupido. Qualcosa (riflessione, codifica manuale, ereditarietà, qualche forma serializzata, ecc.) Lo popola, e poi quando i consumatori chiedono un'istanza che soddisfi alcune interfacce arbitrarie, il localizzatore di servizi lo fornisce. A seconda di come è implementato, non dipende nemmeno dai dati - i suoi consumatori dicono dove andare.
In an enterprise architecture, where is Service Locator most appropriately used, and why?
Tutto ciò detto, il localizzatore di servizi è comunemente visto come un anti-pattern dal momento che il contratto che fornisce (chiedi un'interfaccia arbitraria, ti do un'istanza che lo soddisfa) è molto ampio . Tende ad essere un oggetto di Dio. Tende ad essere un po 'fragile dal momento che gli errori in uso si mostrano solo al runtime.
Questi aspetti negativi sono veri, ma l'anti-pattern implica che produce sempre cattiveria quando viene utilizzato. Questo non è il caso della mia esperienza.
I localizzatori di servizio sono utili quando si hanno molti componenti dinamici che devono essere risolti in fase di esecuzione - componenti che variano a seconda del contesto in cui si sta lavorando. Ad esempio, l'ho visto usato per emulare una varietà di dispositivi hardware, ciascuno con la propria configurazione e capacità. È stato altrettanto facile da testare come contenitori IoC, ha avuto errori di runtime simili, ma ha fornito la flessibilità necessaria che i contenitori IoC non potevano.
Ma questo tipo di scenario è estremamente raro. In generale, avere quel tipo di ricerca di tipo arbitrario non vale il costo.