Skip to content

Instantly share code, notes, and snippets.

@ankona
Last active August 22, 2023 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ankona/5ec30f9444cac020486572a7376ca4a1 to your computer and use it in GitHub Desktop.
Save ankona/5ec30f9444cac020486572a7376ca4a1 to your computer and use it in GitHub Desktop.
Simple demo of dynamically registering a provider to handle a specific event type
import collections
import typing as t
class ServiceProvider:
...
class MessageProvider(t.Protocol):
def write(self, message: str) -> None:
...
class PrintMessageProvider(MessageProvider):
def write(self, message: str) -> None:
print(message)
class FileMessageProvider(MessageProvider):
def __init__(self, file_name: str):
self._file_name = file_name
def write(self, message: str) -> None:
with open(self._file_name, "a+") as file:
file.write(message)
_T = t.TypeVar("_T")
class ServiceManager:
def __init__(self):
self._providers: t.DefaultDict[t.Type[ServiceProvider], t.List[t.Any]] = collections.defaultdict(lambda: [])
def register_service_provider(self, service_api: t.Type[ServiceProvider], provider: t.Type[t.Any]) -> None:
# if doing multiple provider support
# self._providers[service_api].append(provider)
self._providers[service_api] = [provider]
def get_service_provider(self, service_api: t.Type[_T]) -> _T:
registered = self._providers.get(service_api)
if not registered:
raise Exception(f"No registered `{service_api.__name__}` service providers")
return registered[0]
def task(service_manager: ServiceManager):
try:
msg_svc = service_manager.get_service_provider(MessageProvider)
msg_svc.write("Hello from my provider!\n")
except Exception as ex:
print(ex)
manager = ServiceManager()
task(manager)
manager.register_service_provider(MessageProvider, PrintMessageProvider())
task(manager)
manager.register_service_provider(MessageProvider, FileMessageProvider("messages.txt"))
task(manager)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment