- Внедрение в конструктор:
Внедрение в конструктор предполагает передачу зависимостей через конструктор класса. Этот метод гарантирует, что при создании объекта будут предоставлены все необходимые зависимости. Давайте рассмотрим пример:
class UserService:
def __init__(self, user_repository):
self.user_repository = user_repository
def get_user(self, user_id):
return self.user_repository.get(user_id)
В этом примере класс UserService
зависит от объекта user_repository
, который внедряется через конструктор.
- Внедрение сеттеров.
Внедрение сеттеров, также известное как внедрение свойств, предполагает использование методов установки для внедрения зависимостей. Этот метод допускает необязательные зависимости и обеспечивает гибкость в изменении зависимостей во время выполнения. Вот пример:
class PaymentService:
def set_payment_gateway(self, payment_gateway):
self.payment_gateway = payment_gateway
def process_payment(self, amount):
if self.payment_gateway:
self.payment_gateway.process(amount)
else:
raise Exception("Payment gateway not set.")
В этом примере класс PaymentService
имеет метод установки set_payment_gateway
для внедрения зависимости payment_gateway
.
- Инъекция интерфейса.
Инъекция интерфейса — это метод, при котором зависимость внедряется через интерфейс или базовый класс. Такой подход позволяет заменять разные реализации интерфейса. Вот пример:
class Logger:
def log(self, message):
raise NotImplementedError("Subclasses must implement this method.")
class FileLogger(Logger):
def log(self, message):
# Log message to a file
class DatabaseLogger(Logger):
def log(self, message):
# Log message to a database
class UserService:
def set_logger(self, logger):
self.logger = logger
def save_user(self, user):
# Save user logic
self.logger.log("User saved: {}".format(user))
В этом примере класс UserService
зависит от интерфейса Logger
и различных реализаций (FileLogger
и 12) можно вводить.
- Внедрение параметров.
Внедрение параметров предполагает внедрение зависимостей непосредственно в параметры метода. Этот метод полезен, когда зависимость требуется только для конкретного метода, а не для всего класса. Вот пример:
class EmailService:
def send_email(self, recipient, message, mailer):
# Send email using the provided mailer
mailer.send(recipient, message)
class SmtpMailer:
def send(self, recipient, message):
# Send email using SMTP
class MockMailer:
def send(self, recipient, message):
# Mock implementation for testing
email_service = EmailService()
smtp_mailer = SmtpMailer()
mock_mailer = MockMailer()
email_service.send_email("example@example.com", "Hello World!", smtp_mailer)
email_service.send_email("example@example.com", "Hello World!", mock_mailer)
В этом примере метод send_email
класса EmailService
принимает параметр mailer
, который может быть любым объектом, реализующим . 16интерфейс.
Внедрение зависимостей – это мощный метод создания гибких и легко поддерживаемых программных систем. В этой статье мы рассмотрели различные методы внедрения зависимостей, включая внедрение конструктора, внедрение установщика, внедрение интерфейса и внедрение параметров. Понимая эти методы и соответствующие варианты их использования, вы будете хорошо подготовлены к проектированию и разработке надежных приложений.