Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 2, 2022 12:26 am GMT

SOLID - DIP

Princpio da inverso de dependncia

Mdulos de alto nvel no devem depender de mdulos de baixo nvel. Ambos devem depender de abstraes; Abstraes no devem depender de detalhes. Detalhes devem depender de abstraes.

Dependa de uma abstrao e no de uma implementao.

Por exemplo:

Temos uma classe Petshop que recebe no seu construtor um PetRepositorioMySQL e possui o mtodo CadastrarOuAtualizarPet() que verifica se o Pet informado j existe e o atualiza e caso contrrio, cria um novo cadastro.

    public class Petshop    {        private readonly PetRepositorioMySQL _petRepositorioMySQL;        public Petshop()        {            _petRepositorioMySQL = new PetRepositorioMySQL();        }        public void _CadastrarOuAtualizarPet(string nome)        {            var pet = _petRepositorioMySQL.Get(nome);            if (pet == null)                _petRepositorioMySQL.Insert(pet);            else                _petRepositorioMySQL.Update(pet);        }    }

O problema que se um dia ns resolvssemos usar uma PetRepositorioSQLServer no lugar da PetRepositorioMySQL, mesmo as duas possuindo os mesmos metdos, precisaramos mudar a nossa classe Petshop. Nossa classe no deveria ter que saber como se instancia este repositrio ou como que ele se comporta internamente. S precisamos saber o que ele recebe e o que retorna.
Devido a isso, estamos quebrando o princpio da inverso de dependncia.

Soluo:

Criamos a interface IRepositorioGenerico e fazemos com que nossa classe PetRepositorioMySQL implementa-a.

    public class PetRepositorioMySQL : IRepositorioGenerico    {        public Pet Get(string nome)        {            throw new NotImplementedException();        }        public void Insert(Pet pet)        {            throw new NotImplementedException();        }        public void Update(Pet pet)        {            throw new NotImplementedException();        }    }

Dentro da classe Petshop, ns injetamos nossa classe PetRepositorioMySQL representada pela sua interface IRepositorioGenerico.

    public class Petshop    {        private readonly IRepositorioGenerico _repositorio;        public Petshop(IRepositorioGenerico repositorio)        {            _repositorio = repositorio;        }        public void _CadastrarOuAtualizarPet(string nome)        {            var pet = _repositorio.Get(nome);            if (pet == null)                _repositorio.Insert(pet);            else                _repositorio.Update(pet);        }    }

Assim a Petshop no obrigada a instanciar o repositrio, pois quem consumir esta classe deve passar as instncias j criadas no construtor dela. E se caso um dia precisemos mudar o repositrio, no precisaremos alterar a classe PetShop, desde que o novo repositrio implemente a mesma interface. Desta forma, invertemos o controle.


Original Link: https://dev.to/gbarbosa/solid-dip-1138

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To