PADRÃO REPOSITÓRIO

 Tópico anterior Próximo tópico Novo tópico

PADRÃO REPOSITÓRIO

C#

 Compartilhe  Compartilhe  Compartilhe
#484851 - 08/10/2018 14:33:32

DS2T
BARRA MANSA
Cadast. em:Novembro/2010


Boa tarde a todos!

Tenho estudado um pouco sobre boas práticas para tentar melhorar o nível de qualidade do meu código. E conforme vou juntando e lendo material, vejo que não concordo com algumas práticas. Provavelmente por ignorância da minha parte. Com isso, venho pedir ajuda de vocês para ver se ilumina meu pensamento. Agradeço desde já.

Vejo que existe uma conveção em usar interfaces no Repository. Ou seja, cria uma classe de interface e uma outra com a implementação dessa interface.

Existem algumas frases que são ditas como boa prática "Programe para uma interface, e não para uma implementação". Que eu considero extremamente válido, quando existe mais de uma implementação pra interface.

Acontece que, geralmente, isso não acontece no repositório (pode existir para alguns projetos, mas não tive essa necessidade até o momento). Você tem um repositório com implementação única, persistindo no mesmo local.
Vejo muitas pessoas falando "ah, mas se um dia eu precisar persistir em outro lugar, usar interface seria a melhor solução". Aí eu concordo plenamente. Mas como na maioria das vezes este não é o caso, por que usam a interface?  Convenção, preciosismo? Algum outro motivo?


Agradeço quem puder me responder!


"Cansei de frases intelectuais" - Eu mesmo


#484852 - 08/10/2018 15:34:59

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Interfaces são úteis não só para múltiplas implementações, elas tem um variadíssimo repertório de usos. Se eu for explicar tecnicamente vai ficar bem extenso então vou exemplificar ALGUNS casos:
- Imagine uma classe de Produto. Imagine que você quer consultar um produto, mas não vai gravar nada, portanto, nenhuma implementação de gravação é necessária. Isso melhora significativamente a performance, pois teria um objeto muito melhor. Então você cria uma Interface "IReader" e a implementa para cliente. Então para instanciar você faz:

IReadable produto = IRepository.Produto.GetById(99);

Você teria o produto lido e pode trabalhar com ele, mas não vai ter nenhuma implementação de gravação

- Injeção de dependência: Com interfaces, você pode "injetar" objetos e/ou implementações de interfaces em qualquer lugar, sem precisar mudar quase nada no código, bastando usar a interface.
- Interfaces também são úteis para uma padronização de funcionalidade.

As vantagens são várias, mas não são infinitas. Existem muitos casos em  que uma classe virtual seria melhor, é bem coisa de caso à caso

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#484860 - 08/10/2018 22:07:45

DS2T
BARRA MANSA
Cadast. em:Novembro/2010


Última edição em 08/10/2018 22:08:28 por DS2T

Boa noite Kerplunk, obrigado pela resposta!


Citação:
Imagine uma classe de Produto. Imagine que você quer consultar um produto, mas não vai gravar nada, portanto, nenhuma implementação de gravação é necessária. Isso melhora significativamente a performance, pois teria um objeto muito melhor.


Não sou um grande conhecedor, porém, acredito que toda abstração (interface ou classe abstrata) possui um custo. Sendo assim, a performance seria um pouco abaixo (nada significante para a maioria das aplicações. Segue inclusive um link de referência:

https://stackoverflow.com/questions/890687/overhead-of-implementing-an-interface

Então, acredito que não teria uma performance melhor, pelo contrário.

Citação:
- Interfaces também são úteis para uma padronização de funcionalidade.


Concordo.


Citação:
- Injeção de dependência: Com interfaces, você pode "injetar" objetos e/ou implementações de interfaces em qualquer lugar, sem precisar mudar quase nada no código, bastando usar a interface.


Eu estive estudando o Ninject. Talvez por não conhecer ainda todo o potencial da ferramenta, fiquei um pouco confuso no uso do Ninject na maioria dos projetos de exemplo. Onde colocam a interface de repositório no construtor do Controller para o Ninject instanciar ela automaticamente, de acordo com as configurações de Bind do arquivo de configuração.
Li muito a respeito, vi vários exemplos. Concordo que pode ser útil em alguns casos, mas novamente, quando existe mais de uma implementação e você quer mudar rapidamente o comportamento da aplicação, centralizando o bind de interface e implementação.

Já usei injeção de dependência em alguns projetos meus, mas não foi de forma indiscriminada como os exemplos que vejo. Não sei, provavelmente eu sou a ovelha negra que gosta de problematizar tudo hahaha

Talvez por ignorância minha também, mas não vejo um real ganho de produtividade, a não ser, seguir um padrão consolidado pela internet a fora.

Fico na expectativa de mais opiniões.

Agradeço pela contribuição!


"Cansei de frases intelectuais" - Eu mesmo


#484949 - 16/10/2018 08:46:08

MESTRE
GUARULHOS
Cadast. em:Novembro/2013


Última edição em 16/10/2018 08:46:35 por MESTRE

Citação:
:


A forma que eu aprendi foi,

Projeto MVC com EF:
|- [Controllers]
|- [Model]
|- [Persistence]
|- [Repository]
|- [Views]

Dentro de Repository eu crio 2 classes (1 interface e 1 classe comum)
ex:
   public interface IExemploRepository
    {
        void Cadastrar(Classe classe);
        void Atualizar(Classe classe);
        IList<Classe > Listar();

    }

Dentro da classe repository herdo da interface, instancio o context e crio um construtor para ele:
ex: ExemploRepository : IExemploRepository
    private  meuContext _context;

        public ExemploRepository(meuContext context)
        {
            _context = context;
        }

public void Cadastrar(Classe classe)
        {            
            _context.Classe.Add(classe);
        }

        public IList<Classe> Listar()
        {
            return _context.Classe.ToList();
        }


Foi dessa forma que eu aprendi..


_______________________________________________
"A alegria está na luta, na tentativa, no sofrimento envolvido e não na vitória propriamente dita."
Gandhi.


 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário