Service locator pattern
The service locator pattern is a design pattern or anti-pattern used in software development to encapsulate the processes involved in obtaining a service with a strong abstraction layer. This pattern uses a central registry known as the "service locator", which on request returns the information necessary to perform a certain task.[1] The main criticism of service location is that it obscures dependencies.[2] Meanwhile, its proponents say the approach should not be discarded as it simplifies component-based applications where all dependencies are cleanly listed at the beginning of the whole application design, consequently making traditional dependency injection a more complex way of connecting objects. The usual criticism of service locator pattern as being the one which is "much harder to test" actually becomes a benefit in such applications.[citation needed]
Advantages
- The "service locator" can act as a simple run-time linker. This allows code to be added at run-time without re-compiling the application, and in some cases without having to even restart it.
- Applications can optimize themselves at run-time by selectively adding and removing items from the service locator. For example, an application can detect that it has a better library for reading JPG images available than the default one, and alter the registry accordingly.
- Large sections of a library or application can be completely separated. The only link between them becomes the registry.
- An application may use multiple structured service locators purposed for particular functionality/testing. Service locator does not mandate one single static class per process
- The solution may be simpler with service locator (vs. dependency injection) in applications with well-structured component/service design. In these cases the disadvantages may actually be considered as an advantage (e.g. no need to supply various dependencies to every class and maintain dependency configurations)
Disadvantages
- The registry hides the class' dependencies, causing run-time errors instead of compile-time errors when dependencies are missing (similar to using Dependency injection).
- The registry makes the code more difficult to maintain (similar to using Dependency injection), because it becomes unclear when you would be introducing a breaking change.
- The registry makes code harder to test, since all tests need to interact with the same global service locator class to set the fake dependencies of a class under test. However, this is easily overcome by injecting application classes with a single service locator interface.
See also
References
- ^ http://martinfowler.com/articles/injection.html#UsingAServiceLocator
- ^ Seemann, Mark. "Service Locator is an Anti-Pattern". blog.ploeh.dk. Retrieved 2017-06-01.