Dependency Injection: Decoupling Systems

Dependency Injection (DI) is a design pattern that implements **Inversion of Control (IoC)**, allowing components to receive their dependencies from an external assembler rather than creating them internally.

1. Core Injection Modalities

* **Constructor Injection (Recommended):** Dependencies are passed via the class constructor.

* *Benefit:* Ensures the object is always in a valid state and allows for `final` (immutable) fields.

* **Setter Injection:** Dependencies are provided via public setter methods.

* *Use Case:* Optional dependencies or those with sensible defaults.

* **Field Injection:** Using annotations (e.g., `@Inject`, `@Autowired`) directly on private fields.

* *Warning:* Generally an anti-pattern. It makes unit testing harder (requires reflection) and hides dependencies from the class contract.

2. Lifecycles and Scoping

The IoC container manages the lifetime of the injected objects:

| Scope | Description | Use Case |

| :--- | :--- | :--- |

| **Singleton** | One instance per container. | Stateless services, database pools. |

| **Transient** | New instance created for every injection. | Lightweight, stateful objects. |

| **Request/Session**| One instance per HTTP lifecycle. | User context, authentication tokens. |

3. Concrete Implementation: Google Guice

In the Wikantik codebase ([GEMINI.md](GEMINI)), we use Guice for DI.

* **Modules:** Classes that define the bindings (`bind(Interface.class).to(Implementation.class)`).

* **The Injector:** The object that bootstraps the graph and provides the root service.

* **Concrete Tip:** Use **Provider Methods** (`@Provides`) for complex object creation that requires logic or external configuration.

4. Why DI? (The Testing Argument)

The primary value of DI is testability.

* **Stubbing:** In a unit test, you can inject a **Mock** implementation of a repository into a service.

* **Isolating Failure:** By mocking the database, you verify the service's business logic in isolation, ensuring the test fails only if the logic is wrong, not because the database is down.

---

**See Also:**

- [WikiEngine DI Migration](GEMINI) — Project-specific Guice context.

- [Api Design Best Practices](ApiDesignBestPractices) — Building decoupled services.

- [Cloud Networking](CloudNetworking) — Infrastructure dependency parallels.