{"id":79,"date":"2006-04-24T10:40:26","date_gmt":"2006-04-24T09:40:26","guid":{"rendered":"http:\/\/www.galhano.com\/blog\/?p=79"},"modified":"2008-02-07T18:38:32","modified_gmt":"2008-02-07T17:38:32","slug":"provider-model-design-pattern","status":"publish","type":"post","link":"http:\/\/galhano.com\/blog\/?p=79","title":{"rendered":"Provider Model Design Pattern"},"content":{"rendered":"<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"> Na vers\u00c3\u00a3o 2.0 do ASP.NET, com a grande gama de controles a nosso dispor para melhor trabalharmos o front-end (UI), temos ainda classes para manipular os usu\u00c3\u00a1rios em nossa Base de Dados. Classes que utilizam o <strong>Provider Model Design Pattern<\/strong>, e assim consegu\u00c3\u00admos ter um c\u00c3\u00b3digo gen\u00c3\u00a9rico, independentemente de que Banco de Dados (ou qualquer outro tipo de reposit\u00c3\u00b3rio) estamos a utilizar na nossa aplica\u00c3\u00a7\u00c3\u00a3o.<\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"> Assim como o Profile, o ASP.NET tamb\u00c3\u00a9m utiliza o Providers para gerenciar a seguran\u00c3\u00a7a, sendo eles, <strong>dois providers<\/strong>: <strong><em>MembershipProvider<\/em><\/strong> e o <strong><em>RoleProvider<\/em><\/strong>. O MembershipProvider \u00c3\u00a9 utilizado para gerir os usu\u00c3\u00a1rios (armazenando, criando, excluindo e alterando) e passwords. O RoleProvider \u00c3\u00a9 utilizado para gerenciar as Roles (Regras) dos usu\u00c3\u00a1rios dentro da aplica\u00c3\u00a7\u00c3\u00a3o. <\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"> Para vers\u00c3\u00a3o Beta 1, o Provider padr\u00c3\u00a3o \u00c3\u00a9 o <em><strong>AccessMembershipProvider<\/strong><\/em>. Como o Microsoft Access n\u00c3\u00a3o suporta um grande volume de usu\u00c3\u00a1rios &#8220;pendurados&#8221;, ele foi substitu\u00c3\u00addo pelo <strong><em>SqlMembershipProvider<\/em><\/strong> na vers\u00c3\u00a3o Beta 2 do Visual Studio .NET 2005, e como o pr\u00c3\u00b3prio nome diz, \u00c3\u00a9 voltado para o Banco de Dados SQL Server. Se ainda h\u00c3\u00a1 algu\u00c3\u00a9m que pretende utilizar o AccessMembershipProvider, \u00c3\u00a9 poss\u00c3\u00advel encontr\u00c3\u00a1-lo <a target=\"_blank\" href=\"http:\/\/lab.msdn.microsoft.com\/vs2005\/eula.aspx?id=96713a8e-b8d4-4d6e-bb8f-027e6c8e15d8\">neste endere\u00c3\u00a7o<\/a>. \t\t\t\t<\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"> Para utilizar o SqlMembershipProvider, \u00c3\u00a9 necess\u00c3\u00a1rio termos dentro do SQL Server os objetos (Tabelas e Stored Procedures) necess\u00c3\u00a1rios para que seja poss\u00c3\u00advel o uso deste Provider. Junto ao Microsoft .NET que \u00c3\u00a9 instalado na m\u00c3\u00a1quina, existe uma ferramenta chamada <strong>&#8220;aspnet_regsql.exe&#8221;<\/strong>, que faz todo este processo automaticamente, onde apenas precisamos informar o servidor e o Banco de Dados onde ser\u00c3\u00a3o instalados estes objetos.<\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"> Depois do provider escolhido, ainda \u00c3\u00a9 necess\u00c3\u00a1rio definirmos no arquivo Web.Config qual ser\u00c3\u00a1 o provider a ser utilizado.<\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"><strong>Nota: <\/strong>\u00c3\u2030 importante mencionar que dentro do .NET Framework, tamb\u00c3\u00a9m j\u00c3\u00a1 temos implementada a classe <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/library\/ms151914%28en-us,vs.80%29.aspx\">ActiveDirectoryMembershipProvider<\/a>, que faz o mesmo trabalho, mas agora, utilizando o Active Directory como reposit\u00c3\u00b3rio. \t\t\t\t<\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"><strong>Os Controles<\/strong><\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"> O ASP.NET 2.0 cont\u00c3\u00a9m um conjunto completo de controles para trabalharmos com a seguran\u00c3\u00a7a, contendo inclusive uma Tab chamada <em>Security<\/em> dentro da ToolBox do Visual Studio .NET 2005 para armazenar estes controles. Vamos neste artigo, analisar superficialmente alguns destes novos controles, como por exemplo o <em>ChangePassword<\/em>, <em>CreateUser<\/em>, <em>LogIn<\/em>, <em>LoginView<\/em> e o <em>PasswordRecovery<\/em>. Estes controles tamb\u00c3\u00a9m tem a grande vantagem de trabalharem diretamente com o Provider que definimos no arquivo Web.Config, e assim, fazem todo o processo, inclusive as <em>queries<\/em> necess\u00c3\u00a1rias para manipular os dados na Base de Dados. \t\t\t\t<\/font><\/font> <font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" \/><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"> <\/font><\/p>\n<ul><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"> <font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><\/p>\n<li><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\">ChangePassword<\/font><\/font><\/li>\n<li><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\">CreateUser<\/font><\/font><\/li>\n<li><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\">LogIn<\/font><\/font><\/li>\n<li><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\">LoginView<\/font><\/font><\/li>\n<li><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\">PasswordRecovery<br \/>\n<\/font><\/font><\/li>\n<p><\/font><\/font><\/font><\/font><\/font><\/font><\/ul>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"> <\/font><\/font><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><strong><br \/>\n<\/strong><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"><strong>A classe Membership <\/strong><br \/>\n<\/font><\/font><br \/>\n<font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\"> Como j\u00c3\u00a1 vimos anterioramente, est\u00c3\u00a1 \u00c3\u00a9 uma classe abstrata, contendo uma s\u00c3\u00a9rie de m\u00c3\u00a9todos compartilhados. Esta classe recebe em runtime a inst\u00c3\u00a2ncia da classe concreta, ou seja, do provider que definimos o arquivo Web.Config. Claro que estes m\u00c3\u00a9todos ser\u00c3\u00a3o invocados da classe concreta, pois \u00c3\u00a9 onde se encontram os m\u00c3\u00a9todos implementados para uma Base de Dados espec\u00c3\u00adfica.<\/font><\/font><\/font><\/font><\/font><\/font><\/font><\/font><\/p>\n<p><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><\/p>\n<table width=\"100%\" cellspacing=\"2\" cellpadding=\"3\" bgcolor=\"#efefef\" align=\"center\">\n<tr>\n<td style=\"width: 37%\"><font size=\"2\" face=\"arial\"><strong>Membro<\/strong><\/font><\/td>\n<td><font size=\"2\" face=\"arial\"><strong>Descri\u00c3\u00a7\u00c3\u00a3o<\/strong><\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> CreateUser<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Cria um novo usu\u00c3\u00a1rio.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> DeleteUser<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Exclui um usu\u00c3\u00a1rio.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> FindUsersByEmail<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Resgata os usu\u00c3\u00a1rios baseando-se em um endere\u00c3\u00a7o de email.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> FindUsersByName<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Resgata os usu\u00c3\u00a1rios baseando-se em um userName.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> GeneratePassword<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Gera um password aleat\u00c3\u00b3rio.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> GetAllUsers<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Retorna todos os usu\u00c3\u00a1rios.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> GetNumberOfUsersOnline<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Retorna um n\u00c3\u00bamero inteiro representando todos os usu\u00c3\u00a1rios online.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> GetUser<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Resgata um determinado usu\u00c3\u00a1rio baseando-se em um userName.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> GetUsernameByEmail<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Resgata um determinado usu\u00c3\u00a1rio baseando-se em um endere\u00c3\u00a7o de email.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> UpdateUser<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Atualiza as informa\u00c3\u00a7\u00c3\u00b5es de um determinado usu\u00c3\u00a1rio.<\/font><\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\"><img decoding=\"async\" alt=\"Public Method\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Public.jpg\" \/><img decoding=\"async\" alt=\"Shared\" src=\"http:\/\/www.linhadecodigo.com.br\/artigos\/img_artigos\/israel_aece\/Shared.jpg\" \/> ValidateUser<\/font><\/td>\n<td valign=\"top\" bgcolor=\"#ffffff\"><font size=\"2\" face=\"arial\">Retorna um valor booleano indicando se o usu\u00c3\u00a1rio existe ou n\u00c3\u00a3o.<\/font><\/td>\n<\/tr>\n<\/table>\n<p><a href=\"http:\/\/www.linhadecodigo.com.br\/artigos.asp?id_ac=749\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\"><font size=\"2\" face=\"Verdana,Geneva,Arial,Helvetica,sans-serif\" color=\"#000000\">artigo completo<\/font><\/font><\/a><\/font><\/font><!--9d690052b23c1855f6195dc4fe9756ef--><!--15c7a574e2ba7929b5c4344974f3bc5e--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na vers\u00c3\u00a3o 2.0 do ASP.NET, com a grande gama de controles a nosso dispor para melhor trabalharmos o front-end (UI), temos ainda classes para manipular os usu\u00c3\u00a1rios em nossa Base de Dados. Classes que utilizam o Provider Model Design Pattern, e assim consegu\u00c3\u00admos ter um c\u00c3\u00b3digo gen\u00c3\u00a9rico, independentemente de que Banco de Dados (ou qualquer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"close","ping_status":"close","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,28],"tags":[],"class_list":["post-79","post","type-post","status-publish","format-standard","hentry","category-aspnet","category-aspnet-20","author-admin"],"_links":{"self":[{"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/79","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=79"}],"version-history":[{"count":0,"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/79\/revisions"}],"wp:attachment":[{"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=79"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=79"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/galhano.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=79"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}