Dependency Injection
i# Dependency Injection
Description
In software engineering, dependency injection is a software design pattern that implements inversion of control for software libraries. Caller delegates to an external framework the control flow of discovering and importing a service or software module specified or "injected" by the caller.
- Là 1 design pattern.
- Class phụ thuộc vào class khác. Thay vì khởi tạo class trong class ban đầu ta inject intance vào consructor hay setter method.
- Hiện thực cho IoC
DI is about wiring, IoC is about direction, and DIP is about shape.
DI là 1 thực hiện cụ thể, IoC là hướng đi và DIP định hình.
Các loại dependency injection:
- Constructor injection: c
- Setter injection:
- Interface injection:
Example
Class FooController có dùng instance của FooRepositoryInterface.
FooRepositoryInterface được DI thông qua constructor của FooController .
class FooController
{
protected FooRepositoryInterface $fooRepository;
public function __construct(FooRepositoryInterface $fooRepository)
{
$this->fooRepository = $fooRepository;
}
public function indexAction()
{
$bar = $this->fooRepository->getBar();
return "bar-method:" . $bar;
}
}
Tương tự cho FooServiceInterface được DI thông qua constructor của FooRepository.
Để sử dụng FooController.
$fooController = new FooController(new FooRepository(new FooService()));
Issue:
- Class có nhiều dependency và các dependency này là có nhiều dependency khác.
- Đoạn code trên đang DI 1 interface chứ không phải 1 class.
-> Sử dụng DI Container.
Nơi quản lí các dependency,
Tự động resolve và inject các dependency. Chỉ cần type-hinting vào contructor hoặc method DI sẽ tự động resolve cho bạn.
Tương tự như ServiceContainer của Laravel.