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

ความคิดเห็น • 119

  • @gabrielloureiro1779
    @gabrielloureiro1779 2 ปีที่แล้ว +5

    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.

  • @GabrielOliveira-ox4bg
    @GabrielOliveira-ox4bg 4 หลายเดือนก่อน

    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.

  • @eng.wandeson
    @eng.wandeson 2 ปีที่แล้ว +4

    Cara, muito bom! É uma forma inteligente de utilizar a composição!

  • @Romope
    @Romope 2 ปีที่แล้ว +7

    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.

    • @cristianwilliamdev
      @cristianwilliamdev  2 ปีที่แล้ว +2

      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.

  • @felipecouto9044
    @felipecouto9044 7 หลายเดือนก่อน

    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!

    • @cristianwilliamdev
      @cristianwilliamdev  7 หลายเดือนก่อน +1

      Cara que dahora, DDD é maneiro, enriquece demais a forma como a gente desenvolve e estrutura o código, vai firme mano!

  • @ozielsilva9037
    @ozielsilva9037 8 หลายเดือนก่อน +1

    Muito bom cara, me lembro de você, sempre observando as boas praticas. Bom trabalho.

    • @cristianwilliamdev
      @cristianwilliamdev  7 หลายเดือนก่อน

      Feraaaa Oziel! Me lembro de voce mano! Maneiro de ver por aqui! Vlwww demais pela visita mano!

  • @emiliosds
    @emiliosds ปีที่แล้ว +1

    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.

    • @FernandoSilva-yv4bc
      @FernandoSilva-yv4bc 9 หลายเดือนก่อน

      isso resolve um falso problema, os testes devem ser feitos em funcionalidade,services,case uses, e não em abstrações

  • @AndersonSchmitt
    @AndersonSchmitt 6 หลายเดือนก่อน +1

    Primeiro vídeo que vejo do seu canal. Já me inscrevi! Demais!!!

    • @cristianwilliamdev
      @cristianwilliamdev  5 หลายเดือนก่อน

      Porra que foda mano! FIco feliz demais de saber disso!

  • @robertoshendoo4165
    @robertoshendoo4165 2 ปีที่แล้ว +1

    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

  • @carlosoliveiratube
    @carlosoliveiratube 11 หลายเดือนก่อน +1

    Muito bom hein!!! Parabéns pelo video.

    • @cristianwilliamdev
      @cristianwilliamdev  11 หลายเดือนก่อน +1

      Vlww mano! Da uma olhada no video que falo do porque não uso tanto assim repository, talvez goste da ideia!

  • @jessicabeatrizdasilva5572
    @jessicabeatrizdasilva5572 22 วันที่ผ่านมา

    Que vídeo F O D A !

  • @rafaelscheffer1262
    @rafaelscheffer1262 2 ปีที่แล้ว +2

    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

  • @duduplaybyt
    @duduplaybyt ปีที่แล้ว +1

    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!

  • @gilmar69047
    @gilmar69047 9 หลายเดือนก่อน

    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

    • @cristianwilliamdev
      @cristianwilliamdev  9 หลายเดือนก่อน

      Aiii sim mano, implementa e me diz na pratica como ficou...

  • @paulosantiago7831
    @paulosantiago7831 8 หลายเดือนก่อน +1

    Ó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.

    • @cristianwilliamdev
      @cristianwilliamdev  8 หลายเดือนก่อน

      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!

  • @marciokoehler6269
    @marciokoehler6269 ปีที่แล้ว

    Muito bom teus vídeos irmão. Parabéns. Tô ligado no canal. Abraço

  • @gabrielbezerradesouza910
    @gabrielbezerradesouza910 ปีที่แล้ว +1

    melhor aula q já vi

  • @eduardomarinheiroalonso5592
    @eduardomarinheiroalonso5592 2 ปีที่แล้ว +1

    Que Aula! #congrats

  • @JulioBacoli
    @JulioBacoli 2 ปีที่แล้ว +1

    Que canal top de assistir. Valeu jovem

  • @Ilovecode
    @Ilovecode 2 ปีที่แล้ว +1

    Ta de parabéns mano, excelente explicação.

  • @gabrieldesouza4927
    @gabrieldesouza4927 2 ปีที่แล้ว +1

    Excelente, muito esclarecedor.

  • @CledsonPachecoEngComp
    @CledsonPachecoEngComp 2 ปีที่แล้ว +1

    Top demais a abordagem!!!

  • @OHugoOliveira
    @OHugoOliveira 3 ปีที่แล้ว +1

    Sensacional, parabéns pelo conteúdo Cristian!

  • @marciokoehler6269
    @marciokoehler6269 ปีที่แล้ว

    Cara, que top teus vídeos. Muito esclarecedor esse conceito. Abraços irmão.

    • @cristianwilliamdev
      @cristianwilliamdev  ปีที่แล้ว +1

      Obrigado mano! No proximo, vamos entender pq eu não uso mais repos ashusahuhsua

    • @marciokoehler6269
      @marciokoehler6269 ปีที่แล้ว

      @@cristianwilliamdev 😂 Vi que tem umas tretas com o repositório genérico mesmo. Ansioso então pelo próximo vídeo. Abraço

  • @joelopesdesouza9282
    @joelopesdesouza9282 2 ปีที่แล้ว +1

    Valeu professor Christian! excelente aula!

  • @Tibiafy
    @Tibiafy 2 ปีที่แล้ว +1

    Cara... muito top essa aula. Parabéns msm

    • @cristianwilliamdev
      @cristianwilliamdev  2 ปีที่แล้ว

      Vlw mano! Isso é mega importante

    • @Tibiafy
      @Tibiafy 2 ปีที่แล้ว +1

      @@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

  • @hermesfranklin
    @hermesfranklin ปีที่แล้ว +1

    Sensacional

  • @pcbarbassa
    @pcbarbassa 2 ปีที่แล้ว

    Excelente explicação!!! Muito obrigado pela clareza e objetividade!

  • @guilhermevinis
    @guilhermevinis ปีที่แล้ว +1

    Excelente

  • @jonathansantos3182
    @jonathansantos3182 2 ปีที่แล้ว +1

    Muito bom, parabéns👏🏽

  • @abn.tecnologia
    @abn.tecnologia 6 หลายเดือนก่อน

    Ótima estratégia!!

  • @reinaldonascimento
    @reinaldonascimento 2 ปีที่แล้ว +1

    Show!

  • @joaogabrielv.m328
    @joaogabrielv.m328 ปีที่แล้ว +1

    Mano, que achado foi esse vídeo e seu canal. Ganhou um inscrito

  • @stefanysoaresbento3408
    @stefanysoaresbento3408 3 ปีที่แล้ว +1

    Conteúdo incrível!!!

  • @antoniomarcos5664
    @antoniomarcos5664 ปีที่แล้ว

    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

  • @user-jy2so5qc5w
    @user-jy2so5qc5w 10 หลายเดือนก่อน +1

    Tooooooop!

  • @robinsonrenato
    @robinsonrenato ปีที่แล้ว +1

    Q show

  • @nivaldobrasil
    @nivaldobrasil 2 ปีที่แล้ว +1

    muito bom

  • @rodrigo-tj1gf
    @rodrigo-tj1gf 11 หลายเดือนก่อน +1

    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

    • @cristianwilliamdev
      @cristianwilliamdev  10 หลายเดือนก่อน

      HAhahah boa mano, essa ideia de seguir SOLID faz muito mais sentido, não é mesmo?

  • @AlissonBeloti
    @AlissonBeloti 8 หลายเดือนก่อน +2

    Acredito que continua sem segregação. O correto não seria criar um base para cada operação?

    • @cristianwilliamdev
      @cristianwilliamdev  7 หลายเดือนก่อน

      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.

  • @tomasmonteiro9570
    @tomasmonteiro9570 11 หลายเดือนก่อน +1

    Excelente explicação 👏👏
    So uma pergunta: que IDE é essa?

    • @cristianwilliamdev
      @cristianwilliamdev  11 หลายเดือนก่อน +1

      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!

    • @tomasmonteiro9570
      @tomasmonteiro9570 11 หลายเดือนก่อน

      @@cristianwilliamdev
      Opah, legal!
      Achei essa IDE muito atraente e mais leve que o Visual Studio

  • @apollorealms
    @apollorealms 11 หลายเดือนก่อน +2

    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)

    • @cristianwilliamdev
      @cristianwilliamdev  11 หลายเดือนก่อน +1

      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

    • @apollorealms
      @apollorealms 11 หลายเดือนก่อน

      @@cristianwilliamdev obrigado, ótimo conteúdo, irei compartilhar

  • @roneikunkel8625
    @roneikunkel8625 ปีที่แล้ว

    nem uso csharp mas entendi perfeitamente

  • @TecnoPlayCanal
    @TecnoPlayCanal 9 หลายเดือนก่อน +1

    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á?

    • @cristianwilliamdev
      @cristianwilliamdev  8 หลายเดือนก่อน

      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

  • @jesusvieiradelima
    @jesusvieiradelima ปีที่แล้ว

    Muito bacana a aula, aprendi muito.. Você tem algum exemplo usando o padrão Service Pattern ??

  • @iagofilipe1926
    @iagofilipe1926 2 ปีที่แล้ว +1

    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...

    • @cristianwilliamdev
      @cristianwilliamdev  2 ปีที่แล้ว

      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!

  • @LucasAlves-vs6te
    @LucasAlves-vs6te 4 หลายเดือนก่อน +1

    Me tira uma duvida, posso usar esse padão dos dois repository em um unico projeto ou devo sempre usar só apenas um ?

    • @cristianwilliamdev
      @cristianwilliamdev  2 หลายเดือนก่อน

      Cara, isso depende do projeto e da necessidade disso... Lembre sempre de "Keep it simples stupid" KISS

  • @robinsonrenato
    @robinsonrenato ปีที่แล้ว +1

    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 ?

    • @dan.salviano
      @dan.salviano ปีที่แล้ว

      Também pensei assim. Pensando nesse sentido, não faz sentido todo esse trampo. rsrs

    • @cristianwilliamdev
      @cristianwilliamdev  ปีที่แล้ว

      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.

  • @emersonstori
    @emersonstori 2 ปีที่แล้ว +1

    Ficou a duvida de como adicionar o Unity Of Work neste esquema...

    • @cristianwilliamdev
      @cristianwilliamdev  2 ปีที่แล้ว

      Neste caso, voce não mantem o SaveChanges nos métodos do Repo, terá de chamar o savechanges de fora do Repo...

  • @Leanst.
    @Leanst. 8 หลายเดือนก่อน

    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.

    • @cristianwilliamdev
      @cristianwilliamdev  8 หลายเดือนก่อน +2

      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!

    • @AlissonBeloti
      @AlissonBeloti 8 หลายเดือนก่อน

      Mudando a Base repository retirando o abstract tb não quebra o Open/Closed?

  • @lanodecastro
    @lanodecastro 2 ปีที่แล้ว +16

    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

    • @cristianwilliamdev
      @cristianwilliamdev  2 ปีที่แล้ว +1

      Obrigado pelos comentários adicionais

    • @FernandoSilva-yv4bc
      @FernandoSilva-yv4bc 9 หลายเดือนก่อน +2

      exato , eu tava a proocura desse comentario kkk, o vídeo resolve um falso problema,

    • @danieldevfigueiredo
      @danieldevfigueiredo 8 หลายเดือนก่อน

      Valeu pela reflexão, pô.

  • @leoteriopancas
    @leoteriopancas 3 ปีที่แล้ว +1

    Achei seu conteúdo sensacional, mas como fazer quando há dados relacionados?

    • @cristianwilliamdev
      @cristianwilliamdev  3 ปีที่แล้ว +1

      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!

    • @leoteriopancas
      @leoteriopancas 3 ปีที่แล้ว +1

      @@cristianwilliamdev Entendi, vc tem esse projeto no github?

    • @cristianwilliamdev
      @cristianwilliamdev  3 ปีที่แล้ว

      @@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

    • @leoteriopancas
      @leoteriopancas 3 ปีที่แล้ว +1

      Sua didática é ótima

    • @cristianwilliamdev
      @cristianwilliamdev  3 ปีที่แล้ว

      @@leoteriopancas vlw Brother! Vou até printar isso aqui hahaahha

  • @OHugoOliveira
    @OHugoOliveira 2 ปีที่แล้ว +1

    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

    • @cristianwilliamdev
      @cristianwilliamdev  2 ปีที่แล้ว +1

      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

    • @OHugoOliveira
      @OHugoOliveira 2 ปีที่แล้ว +1

      @@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é?

    • @cristianwilliamdev
      @cristianwilliamdev  2 ปีที่แล้ว +1

      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

    • @OHugoOliveira
      @OHugoOliveira 2 ปีที่แล้ว +1

      @@cristianwilliamdev Top manoo, muito obrigado Cristian!!!

    • @cristianwilliamdev
      @cristianwilliamdev  2 ปีที่แล้ว +1

      Tmj meu querido! Bons estudos!

  • @gabrielqueiroz7792
    @gabrielqueiroz7792 4 หลายเดือนก่อน

    qual o nome da fonte?

  • @DPM-TI--MatheusAnalistadesiste
    @DPM-TI--MatheusAnalistadesiste 3 ปีที่แล้ว +1

    sabe muito poderiamos fazer uma parceria kkkkkk

    • @cristianwilliamdev
      @cristianwilliamdev  3 ปีที่แล้ว +1

      Só chamar no privado mano, ou lá no Insta @CristianWilliamDev

  • @mauraocpt9586
    @mauraocpt9586 7 หลายเดือนก่อน

    Isso eu fazia certo sem saber

    • @cristianwilliamdev
      @cristianwilliamdev  7 หลายเดือนก่อน

      Boaaa Maurão, exp é tudo meu irmão ahahah

    • @mauraocpt9586
      @mauraocpt9586 7 หลายเดือนก่อน +1

      @@cristianwilliamdev , oh brother, trocar o meu nome pode, mas o meu sexo nao 😄😄😄

    • @cristianwilliamdev
      @cristianwilliamdev  7 หลายเดือนก่อน

      Nossa hahahahahahay erro de digitação mano ahahahahha