REPOSITORY PATTERN COM SOLID DO JEITO CERTO | DOTNET CSHARP
ฝัง
- เผยแพร่เมื่อ 12 ก.ย. 2024
- #RepositoryPattern é um tema muito conhecido para todo desenvolvedor #backend #dotnet.
Neste video eu mostro como costumo implementar seguindo os principios de #solid na prática, o que vai aumentar a sua qualidade de código.
Se curtiu, não esquece de deixar o like e me seguir no @cristianwilliamdev no Instagram.
Link do Repo: github.com/cri...
Instagram: / cristianwilliamdev
#csharp #dotnet #aspnetcore #aspnet #programacao #arquitetura #cleancode
Muito obrigado, realmente foi bom para entender as injecções e tudo mais. Só queria saber se tem algum video seu explicando a montagem do RepositoryBase, trazendo o dbContext pra ele e tudo mais... Estou com essa dificuldade.
Comecei a fazer arquitetura limpa na minha API e estava querendo entender melhor os conceitos a se aplicar em cada camada, foi muito bom sua explicação, eu já fazia isso com as repository pelo seu mesmo pensamento.
Cara, muito bom! É uma forma inteligente de utilizar a composição!
Muito bom mano, uma pergunta...se o RepositoryBase tem 5 métodos e eu preciso de 4 deles, vou ter que ficar implementar os 4 métodos, se for em um repositorio, ok. Mas se for em 30% de todos eles já fica cansativo, no caso eu teria que criar uma nova composição com os 4 métodos onde essas classes herdariam essa nova porção também? E se outros 30% só precisam de 3 metodos? Acaba que a solução que não viola o SOLID fica muuuuuito verboso ter que fazer várias implementações paralelas.
Se pensar em um contexto de 100 respositórios....30 usam tudo(5 métodos), 30 usam 4 e 40 usam 3....me encheu de trampo nesse rolê hehe.
hahahah isso real fica verboso mano, mas é a solução para que sua classe não seja obrigado a implementar métodos que não precisam... O foco do video foi SOLID... Mas claro que também é importante ver se isso se enquadra em seu cenário sem infligir boas práticas e também o domínio do negócio.
Obrigadão cara! Tô aprendendo DDD em dotnet e apesar de fazer um curso completão, esse seu simples vídeo me ajudou bastante, volta e meia vejo novamente para fixar o conceito, muito brigado, sucesso irmão!
Cara que dahora, DDD é maneiro, enriquece demais a forma como a gente desenvolve e estrutura o código, vai firme mano!
Muito bom cara, me lembro de você, sempre observando as boas praticas. Bom trabalho.
Feraaaa Oziel! Me lembro de voce mano! Maneiro de ver por aqui! Vlwww demais pela visita mano!
Muito bacana, essa abordagem resolve uma outra questão não explorada no vídeo, os testes automatizados. Como dito, ao implementar o repositório genérico, o UsuarioRepository teria o Delete, na hora de fazer o teste automatizado, você teria que fazer uma validação para garantir que o Delete não fosse utilizado, porém, conforme ilustrou, o Delete nem deveria existir no UsuarioRepository , ou seja, teria uma validação que nem faz sentido no meu software. Da forma como implementou, o teste não precisa essa validação, deixando o software mais enxuto e mais limpo. Show de bola, obrigado por compartilhar essa estratégia.
isso resolve um falso problema, os testes devem ser feitos em funcionalidade,services,case uses, e não em abstrações
Primeiro vídeo que vejo do seu canal. Já me inscrevi! Demais!!!
Porra que foda mano! FIco feliz demais de saber disso!
excelente conteúdo, sempre aprendendo algo novo,
fazia meu repositoryBase com apenas o necessário, por exemplo post e update, e o getByName do meu usuarioRepository implementava sem composição, passando meu DbContext, em vez do meu repositoryBase. Espero que seja uma boa prática, pelos dev
Muito bom hein!!! Parabéns pelo video.
Vlww mano! Da uma olhada no video que falo do porque não uso tanto assim repository, talvez goste da ideia!
Que vídeo F O D A !
Bem bacana essa implementação composição é um pattern que eu preciso dar uma estudada. No dia a dia acabo usando mta herança com polimorfismo
Boaa mano!
Caramba, as minhas implementações estavam desta forma e ter metodos que eu nao iria utilizar me incomodava bastante. As vezes era comum que eu fizesse algum tipo de validação pra garantir que elas nao fossem utilizadas kkkk. Muito bacana seu video, ajudou bastante!
Tmj mano! Obrigado pelos comentários!
Eu utilizo este design pattern de uma forma um pouco diferente, mas sua implementação ficou melhor que a minha.... vou anotar aqui no caderninho... parabéns
Aiii sim mano, implementa e me diz na pratica como ficou...
Ótimo conteúdo!
Deixo como sugestão fazer a mesma versão desse projeto com Dapper. Já me deparei com muitas situações onde o EF não é viável dada a complexidade de bancos de dados antigos e mal relacionados.
SIm sim, mas o EF atualmente consegue trabalhar montando queries também e tal, mas sim, o Dapper é mais simples de usar, e as vezes mais eficiente! Obrigado pela dica mano!
Muito bom teus vídeos irmão. Parabéns. Tô ligado no canal. Abraço
Vlww mano! Tmj demais!
melhor aula q já vi
Que Aula! #congrats
Que canal top de assistir. Valeu jovem
Vlw meu amigo! Tmj!!
Ta de parabéns mano, excelente explicação.
Vkwww mesmo! 🤘🏻🤘🏻
Excelente, muito esclarecedor.
Vlww 🤘🏻
Top demais a abordagem!!!
Vlww mano!
Sensacional, parabéns pelo conteúdo Cristian!
Muito obrigado Hugo! Legal demais saber disso!
Cara, que top teus vídeos. Muito esclarecedor esse conceito. Abraços irmão.
Obrigado mano! No proximo, vamos entender pq eu não uso mais repos ashusahuhsua
@@cristianwilliamdev 😂 Vi que tem umas tretas com o repositório genérico mesmo. Ansioso então pelo próximo vídeo. Abraço
Valeu professor Christian! excelente aula!
Cara... muito top essa aula. Parabéns msm
Vlw mano! Isso é mega importante
@@cristianwilliamdev pois é.. eu estava tentando entender um projeto aqui da empresa que fizeram isso.. ai seu vídeo caiu como uma luva meu kirido. Tmj gratidão
Sensacional
Excelente explicação!!! Muito obrigado pela clareza e objetividade!
Excelente
Vkwww mesmo! 🤘🏻🤘🏻
Muito bom, parabéns👏🏽
Ótima estratégia!!
Ai sim! Dahora em mano! Tmj!
Show!
Mano, que achado foi esse vídeo e seu canal. Ganhou um inscrito
Vlwww meu brother, vamo que vamos 😌😌
Conteúdo incrível!!!
Muito obrigado 😃
Show de bola Cristian. Eu costumo usar o repositório genérico e conhecia e também a injeção de dependência com typeof mas... não herdo o repositório genérico, ou seja conforme recomendado, uso a composição ao invés de herança. Para cada entidade tem a interface de repositório própria mas que pode usar via composição também o genérico. A classe concreta seria meu repositório genérico, que recebe uma entidade qualquer mas que implementa minha interface genérica. Acho que falando ficou um pouco confuso, né? ... class GenericRepository : IGenericRepository... IDog : IGenericRepository ... class DogRepository : GenericRepository, IDogRepository
Confuso mano, não saquei não sahusahu a
Tooooooop!
Uhuuuu
Q show
muito bom
Vkwww mesmo! 🤘🏻🤘🏻
krl pior q em um projeto particular meu eu tive exatamente esse problema, mas apenas ignorei msm pq o projeto era meu e ngm mais ia mexer mas eu fiquei curioso com o caso em q algo assim acontecesse em um projeto maior e q funciona ai no mundo de vdd
HAhahah boa mano, essa ideia de seguir SOLID faz muito mais sentido, não é mesmo?
Acredito que continua sem segregação. O correto não seria criar um base para cada operação?
Cara, na real não tem essa de correto, o que quis dizer no video é que temos que pensar na ideia de Interface Segregation também, criar uma separada daria certo também, mas assim, eu não vejo tanta vantagem assim, ao meu ver, em questão de valor mesmo.
Excelente explicação 👏👏
So uma pergunta: que IDE é essa?
Salve mano! Eu uso o Rider IDE, ele é uma IDE da JetBrains, como estou no MAC, ele é melhor, pois o VS do Mac será descontinuada pelo Tio Bill!
@@cristianwilliamdev
Opah, legal!
Achei essa IDE muito atraente e mais leve que o Visual Studio
Sera que isso serve pro meu projeto mobile com sqlite? Tenho uma aplicação com diversas classea diferentes, e todas elas têm operações CRUD. Minha ideia era criar um contexto geral pro banco e implementar genericamente cada operação delas. (Sou iniciante)
Fala mano! Cara, se esta iniciando é importante sim aprender o repository pattern, e serve para qualquer plataforma este pattern, já que seria algo aplicado na sua api, ali no backend... Então independente de ser mobile, desktop, web, poderia ser aplicado sim.
Te convido a assistir um video recente que postei no canal, onde falo o pq não uso tanto assim este pattern! Eu to mais cabeludo, mas confia que é eu mesmo sauhhsuahusa
@@cristianwilliamdev obrigado, ótimo conteúdo, irei compartilhar
nem uso csharp mas entendi perfeitamente
csharp
E se caso eu tiver uma regra de negócio que usuários acima de 25 anos não podem ser adicionados. Em qual camada essa regra de negócio ficará?
Isso é uma regra de negócio, eu aplicaria no dominio da aplicação... Ou seja, a sua aplicação não poderia deixar criar uma classe usuario com idade superior a 25 anos... Eu gosto da ideia de não deixar criar um objeto invalido
Muito bacana a aula, aprendi muito.. Você tem algum exemplo usando o padrão Service Pattern ??
Ainda não, ta na fila aqui
Legal, gostei da abordagem, porém acredito que dessa forma desperdiçamos um pouco de espaço instanciando um RepositoryBase pra usar apenas 1 métódo...
Se a memória for um problema, voce real tem razão, mas a ideia foi mostrar o pq do modo convencional não ir de acordo com SOLID, tmj mano! Obrigado pelo comentário!
Me tira uma duvida, posso usar esse padão dos dois repository em um unico projeto ou devo sempre usar só apenas um ?
Cara, isso depende do projeto e da necessidade disso... Lembre sempre de "Keep it simples stupid" KISS
Christian, analisando essa forma de pensar, eu acabei criando uma outra classe qualquer. Como agora eu posso injetar o _repositoryBase, eu fiz essa injeção nessa classe, criei um objeto do tipo usuario e acessei o método de remover normalmente. Ou seja ele continua desprotegido.
Será que estou falando bobagem ?
Também pensei assim. Pensando nesse sentido, não faz sentido todo esse trampo. rsrs
Vamos dizer que tecnicamente sim, a ideia do Repository base é não usar em classes que não sejam repositories, claro, a ideia do video, é seus repos não expor metodos que não devem ser usados.
Hoje em dia eu nem uso mais repos quando tenho o Entity, mas se usa, eu indicaria não usar Generic Repository por causa do problema do video mesmo, eu diria que pensar no Specific Repository Pattern faz mais sentido. Onde voce teria metodos mais especificos, ao inves de um GET generico por exemplo.
Ficou a duvida de como adicionar o Unity Of Work neste esquema...
Neste caso, voce não mantem o SaveChanges nos métodos do Repo, terá de chamar o savechanges de fora do Repo...
Salve Cristian, bom vídeo, mas vou discordar de que o primeiro modelo do Padrão Repository usando herança fira o ISP, ele não fere se você fizer a sua implementação corretamente. Ao invés de colocar todos os métodos em uma interface e depois ser obrigado a implementá-los, você vai dividir as responsabilidades entre múltiplas interfaces, por exemplo você pode criar algumas interfaces de funcionalidades, por exemplo, IRespositorioUsuarioDelecao, IRespositorioUsuarioArquivar, etc. Com isso, ao herdar a sua classe concreta de Repositório do Usuário, você adiciona as funcionalidades via Interfaces que você quer e pronto, usou a herança lindamente, sem abrir mão das principais funcionalidades e ainda não obrigou a classe a implementar o que não queria. Fica aí a sugestão, abs.
Opaaa, isso funciona sim e garante o ISP, legal demais a ideia, mas no caso, composição não seria menos trabalhoso? Essa pergunta depende do projeto também, mas vlw demais ai pela exp!
Mudando a Base repository retirando o abstract tb não quebra o Open/Closed?
Desculpa meu caro, mas sua justificativa é muito rasa e pretensiosa ao dizer que é a correta. Se deseja usar repository é porque sua aplicação tem aderência aos conceitos do DDD. Se a regra de negócio diz que não vai haver exclusões em uma determinada entidade, então que uma operação de negócio não seja implementada com este objetivo. Um repository nunca deve ser a implementação que orquestrará o fluxo da operação de negócio pretendida. Seu objetivo é fornecer uma abstração de acesso a dados (não somente bancos de dados), de forma de que não crie um acoplamento detalhes de infraestrutura. Uma operação de repository é apenas uma etapa de um fluxo maior. Se assim não for, então a aplicação é mero CRUD e nem precisaria de um repository pra lhe dar com isso, fazendo uso apenas dos ORMs com suas APIs bem projetadas para essas operações mais elementares
Obrigado pelos comentários adicionais
exato , eu tava a proocura desse comentario kkk, o vídeo resolve um falso problema,
Valeu pela reflexão, pô.
Achei seu conteúdo sensacional, mas como fazer quando há dados relacionados?
Fala mano! Não entendi muito bem sua dúvida sobre dados relacionados, mas utilizar deste jeito os repositorios, não impede que crie métodos especificos dentro de seu repo além dos CRUDs do repositorio base generico... A ideia principal do repositorio genérico, é não ter que implementar sempre os métodos CRUDs básicos... Espero te ajudado!
@@cristianwilliamdev Entendi, vc tem esse projeto no github?
@@leoteriopancas vou subir hoje e volto aqui com o link, sugiro antes de rodar, configurar um banco de dados no appsettings ou se usa docker, posso deixar no readme o comando docker que usei pra rodar o sql server
Sua didática é ótima
@@leoteriopancas vlw Brother! Vou até printar isso aqui hahaahha
Salve Cristian, sabe me dizer se no .Net 5 a classe Entity não existe? Estou tentando usar o where TEntity : Entity mas ele não acha essa classe no System.Data
Mano, essa classe foi eu quem criei, ela é só uma classe abstrata com as propriedades padrões que vão em todas as entidades hahaha
Verifica o repositório pra ver como fiz
@@cristianwilliamdev Agora faz sentido hahahahah e o pior que na doc da microsoft existe uma classe com esse nome, o que me bugou ainda mais hahahahah é isso que da pular o vídeo, vlw mano, muito obrigado, baixei o repo aqui e dei uma olhada hahah, mesmo que Entity tenha só o Id lá, sempre que usar o TEntity ele vai usar os dados da classe que eu passei pra ele né?
Isso mano, o que fiz foi obrigar que todas as classes que sejam passadas no lugar de TEntity, obrigatoriamente tenha que herdar a classe Entity que criei… Eu fiz isso pra que não fosse possível criar um repo com qualquer classe
@@cristianwilliamdev Top manoo, muito obrigado Cristian!!!
Tmj meu querido! Bons estudos!
qual o nome da fonte?
Operator mono
sabe muito poderiamos fazer uma parceria kkkkkk
Só chamar no privado mano, ou lá no Insta @CristianWilliamDev
Isso eu fazia certo sem saber
Boaaa Maurão, exp é tudo meu irmão ahahah
@@cristianwilliamdev , oh brother, trocar o meu nome pode, mas o meu sexo nao 😄😄😄
Nossa hahahahahahay erro de digitação mano ahahahahha