{"id":9364,"date":"2023-11-21T11:14:10","date_gmt":"2023-11-21T14:14:10","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=9364"},"modified":"2023-12-27T08:55:44","modified_gmt":"2023-12-27T11:55:44","slug":"ddd-para-que-serve-o-repository","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/ddd-para-que-serve-o-repository\/","title":{"rendered":"DDD &#8211; Para Que Serve o Repository?"},"content":{"rendered":"\n<p>Explorar o concepto do <em>Repository<\/em> no contexto do <em>Domain-Driven Design<\/em> (DDD) oferece uma oportunidade de aprofundar nossos conhecimentos e pr\u00e1ticas em arquitetura e design de software. O <em>Repository<\/em> atua como uma ponte entre a nossa l\u00f3gica de neg\u00f3cios e o modo como armazenamos os dados, mais especificamente tratando da abstra\u00e7\u00e3o de agregados. Este artigo oferece uma an\u00e1lise cr\u00edtica do papel do <em>Repository<\/em>, esclarecendo seu prop\u00f3sito e desfazendo mal-entendidos comuns.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Natureza do <em>Repository<\/em> no DDD<\/h2>\n\n\n\n<p>Um <em>Repository<\/em> em DDD \u00e9 uma interface que nos permite interagir com agregados, unidades de regras de neg\u00f3cio e dados que devem ser tratados juntos. \u00c9 um padr\u00e3o de design que separa a l\u00f3gica de neg\u00f3cios da persist\u00eancia de dados. Essa separa\u00e7\u00e3o promove um c\u00f3digo limpo e facilita manuten\u00e7\u00f5es e evolu\u00e7\u00f5es do sistema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Usos e Mal-Entendidos Comuns do <em>Repository<\/em><\/h2>\n\n\n\n<p>Entender o <em>Repository<\/em> como a \u00fanica via de acesso ao banco de dados \u00e9 um equ\u00edvoco. H\u00e1 situa\u00e7\u00f5es em que o acesso direto, sem passar pelo <em>Repository<\/em>, pode ser prefer\u00edvel por raz\u00f5es de performance ou conveni\u00eancia. Por exemplo, ao realizar opera\u00e7\u00f5es batch ou quando se necessita de consultas que n\u00e3o se alinham bem ao modelo de agregados, podemos optar por servi\u00e7os que acessam o banco de dados diretamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Melhores Pr\u00e1ticas Com Repositories<\/h2>\n\n\n\n<p>Implementar um <em>Repository<\/em> eficaz no DDD requer aten\u00e7\u00e3o ao contexto e \u00e0 necessidade do dom\u00ednio. Vamos ver um exemplo de c\u00f3digo que exemplifica uma implementa\u00e7\u00e3o de <em>Repository<\/em> para um agregado <code>Customer<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"public interface ICustomerRepository\n{\n    Customer GetById(Guid id);\n    void Save(Customer customer);\n    \/\/ Outros m\u00e9todos relacionados ao dom\u00ednio...\n}\n\npublic class CustomerRepository : ICustomerRepository\n{\n    private readonly DbContext _context;\n\n    public CustomerRepository(DbContext context)\n    {\n        _context = context;\n    }\n\n    public Customer GetById(Guid id)\n    {\n        return _context.Customers.Find(id);\n    }\n\n    public void Save(Customer customer)\n    {\n        _context.Entry(customer).State = customer.Id == Guid.Empty ?\n                                        EntityState.Added :\n                                        EntityState.Modified;\n        _context.SaveChanges();\n    }\n\n    \/\/ Implementa\u00e7\u00f5es dos outros m\u00e9todos...\n}\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">interface<\/span><span style=\"color: #D8DEE9FF\"> ICustomerRepository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    Customer <\/span><span style=\"color: #88C0D0\">GetById<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Guid id<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Save<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Customer customer<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Outros m\u00e9todos relacionados ao dom\u00ednio...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">CustomerRepository<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> ICustomerRepository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">readonly<\/span><span style=\"color: #D8DEE9FF\"> DbContext _context<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">CustomerRepository<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">DbContext context<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">_context<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">context<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> Customer <\/span><span style=\"color: #88C0D0\">GetById<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Guid id<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">_context<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Customers<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Find<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">id<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Save<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Customer customer<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">_context<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Entry<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">customer<\/span><span style=\"color: #ECEFF4\">).<\/span><span style=\"color: #D8DEE9\">State<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">customer<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Id<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Guid<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Empty<\/span><span style=\"color: #D8DEE9FF\"> ?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                                        <\/span><span style=\"color: #D8DEE9\">EntityState<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Added<\/span><span style=\"color: #D8DEE9FF\"> :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                                        <\/span><span style=\"color: #D8DEE9\">EntityState<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">Modified<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">_context<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">SaveChanges<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Implementa\u00e7\u00f5es dos outros m\u00e9todos...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Este exemplo demonstra a separa\u00e7\u00e3o entre a l\u00f3gica de neg\u00f3cio e a l\u00f3gica de banco de dados, facilitando o teste e a manuten\u00e7\u00e3o do c\u00f3digo. Uma implementa\u00e7\u00e3o eficaz de <em>Repository<\/em> deve fornecer uma interface que reflita as opera\u00e7\u00f5es dos agregados relevantes para neg\u00f3cios, sem expor detalhes de implementa\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>O uso inteligente e contextualizado do <em>Repository<\/em> \u00e9 essencial para uma arquitetura de software bem projetada em DDD. Ao mesmo tempo, \u00e9 crucial entender que o <em>Repository<\/em> \u00e9 parte de uma abordagem maior e n\u00e3o deve ser visto como uma solu\u00e7\u00e3o universal. O di\u00e1logo entre as necessidades do dom\u00ednio e a tecnologia empregada para persist\u00eancia de dados deve ser constante e informado.<\/p>\n\n\n\n<p>Da discuss\u00e3o sobre o uso efetivo dos <em>Repositories<\/em> em DDD, emergem considera\u00e7\u00f5es sobre tecnologias ORM como Entity Framework e NHibernate, estrat\u00e9gias de consulta otimizadas, e a intersec\u00e7\u00e3o com outras pr\u00e1ticas como CQRS e o padr\u00e3o <em>Unit of Work<\/em>.<\/p>\n\n\n\n<p>Para uma imers\u00e3o mais profunda nessas pr\u00e1ticas e sua aplicabilidade em projetos reais, convido-os a participar dos grupos de estudos e mentorias que conduzo, onde tais t\u00f3picos s\u00e3o frequentemente explorados e discutidos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>O <em>Repository<\/em> \u00e9 uma abstra\u00e7\u00e3o em DDD que facilita a intera\u00e7\u00e3o com agregados, atuando como um mediador entre a l\u00f3gica de neg\u00f3cios e a persist\u00eancia de dados.<\/li>\n\n\n\n<li>\u00c9 err\u00f4neo considerar o <em>Repository<\/em> como a \u00fanica forma de acesso ao banco de dados; sua aplica\u00e7\u00e3o deve ser contextualizada e adequada.<\/li>\n\n\n\n<li>Implementa\u00e7\u00f5es de <em>Repositories<\/em> devem respeitar os princ\u00edpios do DDD e refletir as opera\u00e7\u00f5es do dom\u00ednio, como demonstrado no exemplo de c\u00f3digo.<\/li>\n<\/ol>\n","protected":false},"featured_media":9365,"parent":0,"template":"","cursos":[12],"class_list":["post-9364","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-ddd-do-jeito-certo"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/9364","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/9365"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=9364"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=9364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}