{"id":5838,"date":"2018-01-12T16:38:48","date_gmt":"2018-01-12T18:38:48","guid":{"rendered":"http:\/\/gianfratti.com\/?p=5838"},"modified":"2018-01-12T16:43:28","modified_gmt":"2018-01-12T18:43:28","slug":"criando-interfaces-genericas","status":"publish","type":"post","link":"http:\/\/gianfratti.com\/index.php\/criando-interfaces-genericas\/","title":{"rendered":"Criando Interfaces Gen\u00e9ricas"},"content":{"rendered":"<p>De forma bem simples e pr\u00e1tica mostrarei como criar Interfaces gen\u00e9ricas com C#.<\/p>\n<p>Como muito de n\u00f3s sabemos, usar interfaces em nossos sistemas nos tr\u00e1s mais controle quando se trata das funcionalidades essenciais que devem ser desenvolvidas, sua ideia traz o mesmo sentido de um \u201ccontrato\u201d. Uma classe que implementa uma Interface deve conter todas as assinaturas de m\u00e9todos que a interface possui.<\/p>\n<p><!--more--><\/p>\n<p>Deste modo, \u00e9 comum termos v\u00e1rias interfaces em nossos projetos com v\u00e1rias assinaturas diferentes. N\u00e3o utilizando interfaces gen\u00e9ricas, pode ser comum estruturas como esta abaixo:<\/p>\n<ul>\n<li>Interfaces<\/li>\n<\/ul>\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">public<\/code> <code class=\"csharp keyword\">interface<\/code> <code class=\"csharp plain\">IProduct<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code> <code class=\"csharp plain\">Create(Product prod);<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code> <code class=\"csharp plain\">Update(Product prod);<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">List&lt;Product&gt; List();<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code> <code class=\"csharp plain\">Delete(<\/code><code class=\"csharp keyword\">int<\/code> <code class=\"csharp plain\">productId);<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"csharp plain\">}<\/code><\/div>\n<div><\/div>\n<div>\n<div class=\"line number12 index11 alt1\"><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">interface<\/code><code class=\"csharp plain\">IUser<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Create(User user);<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Update(User user);<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">List&lt;User&gt; List();<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Delete(<\/code><code class=\"csharp keyword\">int<\/code><code class=\"csharp plain\">userId);<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"csharp plain\">}<\/code><\/div>\n<ul>\n<li>Classes<\/li>\n<\/ul>\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">class<\/code><code class=\"csharp plain\">Product : IProduct<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Create(Product prod)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/[funcionalidade]<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Update(Product prod)<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/[funcionalidade]<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"csharp keyword\">public<\/code><code class=\"csharp plain\">List&lt;Product&gt; List()<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/[funcionalidade]<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Delete()<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/[funcionalidade]<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">class<\/code><code class=\"csharp plain\">User : IUser<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Create(User user)<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/[funcionalidade]<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Update(User user)<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/[funcionalidade]<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code><code class=\"csharp plain\">List&lt;User&gt; List()<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/[funcionalidade]<\/code><\/div>\n<div class=\"line number39 index38 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Delete(<\/code><code class=\"csharp keyword\">int<\/code><code class=\"csharp plain\">userId)<\/code><\/div>\n<div class=\"line number42 index41 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number43 index42 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"csharp comments\">\/\/[funcionalidade]<\/code><\/div>\n<div class=\"line number44 index43 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number45 index44 alt2\"><code class=\"csharp plain\">}<\/code><\/div>\n<div><\/div>\n<div>Note que, estas classes e interfaces s\u00e3o muito semelhantes em sua ess\u00eancia, basicamente o que muda \u00e9 apenas a entidade manipulada. Pensando que haja necessidade de manuten\u00e7\u00e3o nestas interfaces, provavelmente acabe sendo preciso altera em v\u00e1rios lugares diferentes dependendo da altera\u00e7\u00e3o na assinaturas. Em casos como estes \u00e9 poss\u00edvel fazer uma abordagem mais elegante e mais f\u00e1cil para manuten\u00e7\u00e3o atrav\u00e9s de Interfaces Gen\u00e9ricas, que veremos agora.<\/div>\n<\/div>\n<ul>\n<li>Interface Gen\u00e9rica<\/li>\n<\/ul>\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">interface<\/code><code class=\"csharp plain\">IGenericCRUD&lt;T&gt; <\/code><code class=\"csharp keyword\">where<\/code><code class=\"csharp plain\">T : <\/code><code class=\"csharp keyword\">class<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Create(T entity);<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Update(T entity);<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"csharp plain\">List&lt;T&gt; List();<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">Delete(<\/code><code class=\"csharp keyword\">int<\/code><code class=\"csharp plain\">entityId);<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"csharp plain\">}<\/code><\/div>\n<div><\/div>\n<\/div>\n<div>Desta forma, acabamos de criar uma classe que tem como suas assinaturas b\u00e1sicas do\u00a0<em>CRUD\u00a0<\/em>(<em>Create, Retrieve, Update e Delete<\/em>). Com ela, a classe que a implementar poder\u00e1 conter qualquer objeto T, se tornando mais f\u00e1cil a manuten\u00e7\u00e3o.<br \/>\nAgora basta que voc\u00ea implemente das interfaces comuns esta interface gen\u00e9rica, ficando da seguinte forma:<\/div>\n<div><\/div>\n<\/div>\n<div>\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">interface<\/code><code class=\"csharp plain\">IProduct : IGenericsCRUD&lt;Product&gt;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">int<\/code><code class=\"csharp plain\">GenerateNewId(); <\/code><code class=\"csharp comments\">\/\/nova assinatura criada<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"csharp plain\">}<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"csharp keyword\">public<\/code><code class=\"csharp keyword\">interface<\/code><code class=\"csharp plain\">IUser : IGenericsCRUD&lt;User&gt;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"csharp plain\">{<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"csharp spaces\">\u00a0\u00a0\u00a0<\/code><code class=\"csharp keyword\">bool<\/code><code class=\"csharp plain\">IsRepeated(<\/code><code class=\"csharp keyword\">int<\/code><code class=\"csharp plain\">userId); <\/code><code class=\"csharp comments\">\/\/nova assinatura criada<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"csharp plain\">}<\/code><\/div>\n<\/div>\n<div>\n<p>Voc\u00ea deve ter percebido o qu\u00e3o enxuto ficou agora o c\u00f3digo, n\u00e3o \u00e9?<\/p>\n<p>Criamos novas assinaturas de m\u00e9todos para as interfaces IProduct e IUser, apenas para simular novas caracter\u00edsticas nestas classes, mas ambas est\u00e3o reutilizado todas as assinaturas da IGenericsCRUD, com c\u00f3digo mais coeso o tornando mais f\u00e1cil para manuten\u00e7\u00e3o.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>De forma bem simples e pr\u00e1tica mostrarei como criar Interfaces gen\u00e9ricas com C#. Como muito de n\u00f3s sabemos, usar interfaces em nossos sistemas nos tr\u00e1s mais controle quando se trata das funcionalidades essenciais que devem ser desenvolvidas, sua ideia traz o mesmo sentido de um \u201ccontrato\u201d. Uma classe que implementa uma Interface deve conter todas <span class=\"ellipsis\">&hellip;<\/span> <span class=\"more-link-wrap\"><a href=\"http:\/\/gianfratti.com\/index.php\/criando-interfaces-genericas\/\" class=\"more-link\"><span>Read More &rarr;<\/span><\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2,170,15,183],"tags":[216,215],"class_list":["post-5838","post","type-post","status-publish","format-standard","hentry","category-net-framework","category-arquitetura","category-back-end","category-back-end-arquitetura","tag-crud","tag-interface"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/5838","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/comments?post=5838"}],"version-history":[{"count":4,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/5838\/revisions"}],"predecessor-version":[{"id":5842,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/5838\/revisions\/5842"}],"wp:attachment":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/media?parent=5838"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/categories?post=5838"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/tags?post=5838"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}