DI とは何か
DI(Dependency Injection)は「必要な部品を、クラスの外で用意して渡す」設計です。受注管理システムを例にすると理解しやすくなります。
依存性とは
ある処理が動くために、別の部品を必要とする状態を「依存」と呼びます。 例えば「受注を登録する処理」が「商品マスタ照会」を使うなら、受注処理は商品照会機能に依存しています。
注入とは
「注入」は、必要な部品を外部から渡すことです。
自分で new して固定せず、引数として受け取ります。
受注と商品の例
EC を想像してください。受注登録時に「商品コードが存在するか」「販売停止中でないか」を確認します。 このとき受注処理は商品情報を参照する部品を使います。
DI のポイントは、受注処理側が「どのDBで商品を読むか」まで決めないことです。 商品の取得先は、外から注入された部品に任せます。
DI なしの例
class OrderService {
private ProductGateway productGateway = new ProductDbGateway();
void createOrder(Order order) {
Product product = productGateway.findByCode(order.getProductCode());
// 在庫や販売可否チェック
}
}
この実装は一見シンプルですが、商品取得先を API に変えたい時に OrderService の修正が必要になります。
DI ありの例
class OrderService {
private final ProductGateway productGateway;
OrderService(ProductGateway productGateway) {
this.productGateway = productGateway;
}
void createOrder(Order order) {
Product product = productGateway.findByCode(order.getProductCode());
// 在庫や販売可否チェック
}
}
こうしておくと、DB版の実装でも外部API版の実装でも、テスト用モックでも差し替え可能です。 本質は「利用側が具体実装を決めない」ことです。
DI は新しい機能を増やす技術ではなく、変更に強い構造を作る技術です。