diff --git a/examples/miniapps/use_cases/README.rst b/examples/miniapps/use_cases/README.rst new file mode 100644 index 00000000..ed860891 --- /dev/null +++ b/examples/miniapps/use_cases/README.rst @@ -0,0 +1,9 @@ +Dependency Injector Use Cases example +===================================== + +Instructions for running + +.. code-block:: bash + + python run.py prod example@example.com + python run.py test example@example.com diff --git a/examples/miniapps/use_cases/containers.py b/examples/miniapps/use_cases/containers.py new file mode 100644 index 00000000..847fada3 --- /dev/null +++ b/examples/miniapps/use_cases/containers.py @@ -0,0 +1,30 @@ +"""Dependency injection containers for 'Use Cases' example application.""" + +from dependency_injector import containers, providers + +from example.adapters import SmtpEmailSender, EchoEmailSender +from example.use_cases import SignupUseCase + + +class Adapters(containers.DeclarativeContainer): + """Adapters container.""" + + email_sender = providers.Singleton(SmtpEmailSender) + + +class TestAdapters(containers.DeclarativeContainer): + """Adapters container. + + This container is used for testing purposes. + """ + + email_sender = providers.Singleton(EchoEmailSender) + + +class UseCases(containers.DeclarativeContainer): + """Use cases container.""" + + adapters = providers.DependenciesContainer() + + signup = providers.Factory(SignupUseCase, + email_sender=adapters.email_sender) diff --git a/examples/miniapps/use_cases/example/__init__.py b/examples/miniapps/use_cases/example/__init__.py new file mode 100644 index 00000000..bfa99aa2 --- /dev/null +++ b/examples/miniapps/use_cases/example/__init__.py @@ -0,0 +1 @@ +"""Example top-level package.""" diff --git a/examples/miniapps/use_cases/example/adapters.py b/examples/miniapps/use_cases/example/adapters.py new file mode 100644 index 00000000..8b9312c9 --- /dev/null +++ b/examples/miniapps/use_cases/example/adapters.py @@ -0,0 +1,25 @@ +"""Example adapters package.""" + + +class EmailSender(object): + """Abstract email sender.""" + + def send(self, to, body): + """Send email to specified email.""" + raise NotImplementedError() + + +class SmtpEmailSender(object): + """SMTP email sender uses SMTP protocol for sending emails.""" + + def send(self, to, body): + """Send email to specified email.""" + # Send email via SMTP + + +class EchoEmailSender(object): + """Echo email sender prints emails to stdout.""" + + def send(self, to, body): + """Send email to specified email.""" + print('Sending email to "{0}", body = "{1}"'.format(to, body)) diff --git a/examples/miniapps/use_cases/example/use_cases.py b/examples/miniapps/use_cases/example/use_cases.py new file mode 100644 index 00000000..8bf5c938 --- /dev/null +++ b/examples/miniapps/use_cases/example/use_cases.py @@ -0,0 +1,22 @@ +"""Example use cases package.""" + + +class UseCase(object): + """Abstract use case.""" + + def execute(self): + """Execute use case handling.""" + raise NotImplementedError() + + +class SignupUseCase(object): + """Sign up use cases registers users.""" + + def __init__(self, email_sender): + """Initializer.""" + self.email_sender = email_sender + + def execute(self, email): + """Execute use case handling.""" + print('Sign up user {0}'.format(email)) + self.email_sender.send(email, 'Welcome, "{}"'.format(email)) diff --git a/examples/miniapps/use_cases/run.py b/examples/miniapps/use_cases/run.py new file mode 100644 index 00000000..873f908a --- /dev/null +++ b/examples/miniapps/use_cases/run.py @@ -0,0 +1,19 @@ +"""Run 'Use Cases' example application.""" + +import sys + +from containers import Adapters, TestAdapters, UseCases + + +if __name__ == '__main__': + environment, email = sys.argv[1:] + + if environment == 'prod': + adapters = Adapters() + elif environment == 'test': + adapters = TestAdapters() + + use_cases = UseCases(adapters=adapters) + + use_case = use_cases.signup() + use_case.execute(email)