0
respostas

Injeção de dependência vs Instância no construtor

Olá, eu estou trabalhando em um projeto onde tem classes que tem dependências e essas dependências também tem dependências e assim um caminho sem volta...

Bom, eu queria saber se estou fazendo certo (eu acho que sim). Eu uso o construtor para injetar dependências que realmente é necessário para uma classe, um ID, ou algo assim...

Eu fiz o exemplo abaixo que é a forma que eu uso, que creio que esteja certo. Esse model não é injetado como dependência e sim instânciado no momento da criação do objeto ExemploRepo(), pois pelo que sei, se eu coloco ele como dependência preciso suprir essa dependência sempre que precisa da minha classe ExemploRepo.

class ExampleRepo implements iRepository
{
    protected $model;
    protected $mailService;

    public function __construct()
    {
        $this->model = new User();
        $this->mailService = new MailService('smtp');
    }

    public function create($data)
    {
        $this->model->create();
        $this->mailService->sendMail($data['email']);
        // Faz todo o trâmite de criação
    }
}

No projeto que estou trabalhando atualmente toda as instâncias é repassado para o construtor como injeção de dependência. Nesse caso, não consigo refatorar pra melhorar esse código porque essas dependência, também tem dependências... Exemplo no código abaixo.:

class ExampleRepo implements iRepository
{
    protected $model;
    protected $mailService;

    public function __construct(User $model, MailService $mailService)
    {
        $this->model = $model;
        $this->mailService = $mailService;
    }

    public function create($data)
    {
        $this->model->create();
        $this->mailService->sendMail($data['email']);
        // Faz todo o trâmite de criação
    }
}

Pelo que estudei e pelo que aprendi estudando design patterns o mais certo é o primeiro caso, pois assim a gente não precisa SEMPRE suprir dependências de outras classes que também tem dependências. Isso gera um problema que se expande em todo o projeto e eu estou com esse problema nesse exato momento e foi isso que me fez questionar a forma certa de estar utilizando os constructors e injeção de dependência.

Afinal, estou certo?