솔리드 - 딥

6493 단어 solidpoooopbeginners
Inversão de Dependência의 원리

Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações; Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações.



Dependa de uma abstração e não de uma implementação.

예를 들면:

Petshop 클래스는 PetRepositorioMySQL 생성자 및 CadastrarOuAtualizarPet() 메서드를 생성할 수 없으며 애완 동물 정보가 존재하는지 확인할 수 있는지 확인할 수 없습니다.

    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);
        }
    }


문제는 PetRepositorioSQLServer가 PetRepositorioMySQL을 사용하지 않고 문제를 해결하는 데 문제가 있으며, Petshop은 어떤 방식으로든 사용할 수 있습니다. Nossa classe não deveria ter que saber como se instancia este repositório ou como que ele se comporta internamente. Só precisamos saber o que ele recebe eo que retorna.
Devido a isso, estamos quebrando o princípio da inversão de dependsência.

해결책:

Criamos 인터페이스 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();
        }
    }


Petshop 클래스는 PetRepositorioMySQL 클래스가 아니라 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);
        }
    }


애완 동물 가게를 인스턴스 또는 리포지토리로 가져오지 말고 소비자가 클래스를 생성하도록 허용하지 않도록 인스턴스를 생성하지 마십시오. 예를 들어, 저장소의 정확한 위치에 따라 PetShop 클래스의 정확한 위치를 변경하지 않고 새로운 저장소에서 mesma 인터페이스를 구현합니다. Desta forma, invertemos o controle.

좋은 웹페이지 즐겨찾기