The before code shows UserService creating its own Database instance, causing tight coupling. The after code uses a simple DI container to inject the Database instance into UserService, enabling loose coupling and easier testing.
### Before: Without Dependency Injection Framework
class Database:
def connect(self):
return "Connected to database"
class UserService:
def __init__(self):
self.db = Database() # Direct dependency creation
def get_user(self):
return self.db.connect()
service = UserService()
print(service.get_user())
### After: With Dependency Injection Framework
class Database:
def connect(self):
return "Connected to database"
class UserService:
def __init__(self, db): # Dependency injected
self.db = db
class DIContainer:
def __init__(self):
self._services = {}
def register(self, key, instance):
self._services[key] = instance
def resolve(self, key):
return self._services.get(key)
container = DIContainer()
container.register('db', Database())
service = UserService(container.resolve('db'))
print(service.get_user())