---
title: Use Dependency Injection
impact: HIGH
impactDescription: enables testability and loose coupling
tags: dependency-injection, testing, coupling, architecture, quality, python, pyspark
---

## Use Dependency Injection

Direct instantiation creates tight coupling, making testing difficult and changes risky. DI enables mockability, replaceability, and testability. In Python, this is often done using constructor injection or DI frameworks.

**Incorrect (hardcoded dependencies):**

```python
class OrderService:
    def __init__(self):
        self.db = DatabaseConnection() # Hardcoded dependency
        self.mailer = EmailService()   # Hardcoded dependency

    def create_order(self, data):
        order = self.db.insert('orders', data)
        self.mailer.send(data['email'], 'Order created')
        return order
```

**Correct (injected dependencies):**

```python
class OrderService:
    def __init__(self, db, mailer):
        self.db = db
        self.mailer = mailer

    def create_order(self, data):
        order = self.db.insert('orders', data)
        self.mailer.send(data['email'], 'Order created')
        return order

# Usage
service = OrderService(
    db=PostgresDatabase(conn_string),
    mailer=SendGridMailer(api_key)
)

# Testing with pytest/unittest.mock
from unittest.mock import MagicMock
mock_db = MagicMock()
mock_mailer = MagicMock()
test_service = OrderService(db=mock_db, mailer=mock_mailer)
```

**PySpark Context:**
In Spark, dependencies like `SparkSession` should be passed to processing functions or classes rather than using globals like `SparkSession.builder.getOrCreate()` everywhere.

```python
def process_data(spark: SparkSession, input_path: String):
    df = spark.read.load(input_path)
    # ... process
    return df
```

**Benefits:**
- Easy mocking for unit tests
- Swappable implementations (e.g., local vs cloud storage)
- Clear dependencies visible in constructor
- Supports interface-based design (using Protocols or ABCs)

**Tools:** Static analyzer, PR review, dependency-injector (library)
