{"id":46,"date":"2013-12-10T00:05:45","date_gmt":"2013-12-10T03:05:45","guid":{"rendered":"http:\/\/www.hectordufau.com.br\/wp\/?p=46"},"modified":"2014-01-05T05:42:16","modified_gmt":"2014-01-05T08:42:16","slug":"proposta-de-arquitetura-parte-5-logica-de-negocios","status":"publish","type":"post","link":"https:\/\/www.hectordufau.com.br\/wp\/?p=46","title":{"rendered":"Proposta de Arquitetura &#8211; Parte 5 &#8211; L\u00f3gica de Neg\u00f3cios"},"content":{"rendered":"<p>Neste artigo vamos conhecer as classes que s\u00e3o respons\u00e1veis pela base das demais classes respons\u00e1veis pela l\u00f3gica de neg\u00f3cios, realizando a cria\u00e7\u00e3o, atualiza\u00e7\u00e3o, exclus\u00e3o e consulta dos registros, atrav\u00e9s dos objetos que representam as tabelas do banco (entidades), ou tratando os dados antes de executar as opera\u00e7\u00f5es b\u00e1sicas.<!--more--><\/p>\n<p>Come\u00e7aremos pela interface IRepositorioCLN:<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\"><strong>************ IRepositorioCLN.cs\u00a0<span style=\"line-height: 1.3em;\">************<br \/>\n<\/span><\/strong><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong><span style=\"line-height: 1.3em;\">\u00a0<\/span><\/strong><\/span><\/p>\n<p><span style=\"color: #000080;\"><span style=\"line-height: 1.3em;\">using System;<br \/>\nusing System.Collections.Generic;<br \/>\nusing System.Data.Objects.DataClasses;<br \/>\nusing System.Linq.Expressions;<br \/>\nusing HLMI.Cadastro.CES;<\/p>\n<p>namespace HLMI.<span style=\"color: #000080;\"><span style=\"line-height: 1.3em;\">Cadastro<\/span><\/span>.CLN<br \/>\n{<br \/>\npublic interface IRepositorioCLN&lt;T&gt; where T : EntityObject<br \/>\n{<br \/>\nT VerRegistroPorCodigo(long codigo);<br \/>\nT Salvar(T registro);<br \/>\nbool Atualizar(T registro);<br \/>\nbool Excluir(T registro);<br \/>\nList&lt;T&gt; ListarTodos();<br \/>\nList&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression);<br \/>\nList&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2);<br \/>\nList&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2, Expression&lt;Func&lt;T, bool&gt;&gt; expression3);<br \/>\nList&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2, Expression&lt;Func&lt;T, bool&gt;&gt; expression3, Expression&lt;Func&lt;T, bool&gt;&gt; expression4);<br \/>\nList&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2, Expression&lt;Func&lt;T, bool&gt;&gt; expression3, Expression&lt;Func&lt;T, bool&gt;&gt; expression4, Expression&lt;Func&lt;T, bool&gt;&gt; expression5);<br \/>\nList&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2, Expression&lt;Func&lt;T, bool&gt;&gt; expression3, Expression&lt;Func&lt;T, bool&gt;&gt; expression4, Expression&lt;Func&lt;T, bool&gt;&gt; expression5, Expression&lt;Func&lt;T, bool&gt;&gt; expression6);<br \/>\n}<br \/>\n}<\/span><\/span><\/p>\n<p><span style=\"color: #000080;\"><span style=\"line-height: 1.3em;\">\u00a0<\/span><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong>***************************************<br \/>\n<\/strong><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong>\u00a0<\/strong><\/span><\/p>\n<p>O objetivo de uma interface \u00e9 separar o nome do metodo da sua implementa\u00e7\u00e3o, assim como um objeto pode ser referenciado atrav\u00e9s da sua interface. Quando uma classe que implementa uma interface for criada, podemos instanciar esta classe atrav\u00e9s da sua interface, ou criar m\u00e9todos que tem como par\u00e2metros uma interface, assim qualquer classe que a implemente pode ser utilizada neste par\u00e2metro. Essa \u00e9 uma caracter\u00edstica da heran\u00e7a na programa\u00e7\u00e3o orientada a objetos.<\/p>\n<p>A classe a seguir implementa a interface que apresentamos, e ela \u00e9 a classe base para manipularmos todas as entidades. \u00c9 a classe <strong><em>BaseCLN<\/em><\/strong>:<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\"><strong>*********** BaseCLN.cs ******************<br \/>\n<\/strong><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong>\u00a0<\/strong><\/span><\/p>\n<p><span style=\"color: #000080;\">using System.Collections.Generic;<br \/>\nusing System.Data.Objects.DataClasses;<br \/>\nusing HLMI.<span style=\"color: #000080;\">Cadastro<\/span>.CAD;<br \/>\nusing HLMI.<span style=\"color: #000080;\">Cadastro<\/span>.CES;<br \/>\nusing System.Linq.Expressions;<br \/>\nusing System;<\/p>\n<p>namespace HLMI.Cadastro.CLN<br \/>\n{<br \/>\npublic class BaseCLN&lt;T&gt; :\u00a0 IRepositorioCLN&lt;T&gt; where T : EntityObject<br \/>\n{<br \/>\npublic List&lt;string&gt; Mensagem { private set; get; }<\/p>\n<p>public BaseCLN()<br \/>\n{<br \/>\nMensagem = new List&lt;string&gt;();<br \/>\n}<\/p>\n<p>public List&lt;T&gt; ListarTodos()<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().ListarTodos();<br \/>\n}<\/p>\n<p>public T VerRegistroPorCodigo(long codigo)<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().VerRegistroPorCodigo(codigo);<br \/>\n}<\/p>\n<p>public List&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression)<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().ListarPorExpressao(expression);<br \/>\n}<\/p>\n<p>public List&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2)<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().ListarPorExpressao(expression1, expression2);<br \/>\n}<\/p>\n<p>public List&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2, Expression&lt;Func&lt;T, bool&gt;&gt; expression3)<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().ListarPorExpressao(expression1, expression2, expression3);<br \/>\n}<\/p>\n<p>public List&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2, Expression&lt;Func&lt;T, bool&gt;&gt; expression3, Expression&lt;Func&lt;T, bool&gt;&gt; expression4)<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().ListarPorExpressao(expression1, expression2, expression3, expression4);<br \/>\n}<\/p>\n<p>public List&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2, Expression&lt;Func&lt;T, bool&gt;&gt; expression3, Expression&lt;Func&lt;T, bool&gt;&gt; expression4, Expression&lt;Func&lt;T, bool&gt;&gt; expression5)<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().ListarPorExpressao(expression1, expression2, expression3, expression4, expression5);<br \/>\n}<\/p>\n<p>public List&lt;T&gt; ListarPorExpressao(Expression&lt;Func&lt;T, bool&gt;&gt; expression1, Expression&lt;Func&lt;T, bool&gt;&gt; expression2, Expression&lt;Func&lt;T, bool&gt;&gt; expression3, Expression&lt;Func&lt;T, bool&gt;&gt; expression4, Expression&lt;Func&lt;T, bool&gt;&gt; expression5, Expression&lt;Func&lt;T, bool&gt;&gt; expression6)<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().ListarPorExpressao(expression1, expression2, expression3, expression4, expression5, expression6);<br \/>\n}<\/p>\n<p>public T Salvar(T registro)<br \/>\n{<br \/>\ntry<br \/>\n{<br \/>\nregistro = new BaseCAD&lt;T&gt;().Salvar(registro);<br \/>\nMensagem.Add(&#8220;Salvo com sucesso.&#8221;);<br \/>\n}<br \/>\ncatch (Exception ex)<br \/>\n{<br \/>\nMensagem.Add(&#8220;Registro n\u00e3o efetuado. &#8221; + ex.Message);<br \/>\n}<br \/>\nreturn registro;<br \/>\n}<\/p>\n<p>public bool Atualizar(T registro)<br \/>\n{<br \/>\nvar sucesso = new BaseCAD&lt;T&gt;().Atualizar(registro);<br \/>\nif (sucesso)<br \/>\nMensagem.Add(&#8220;Salvo com sucesso.&#8221;);<br \/>\nelse<br \/>\nMensagem.Add(&#8220;Registro n\u00e3o realizado.&#8221;);<br \/>\nreturn sucesso;<br \/>\n}<\/p>\n<p>public bool Excluir(T registro)<br \/>\n{<br \/>\nreturn new BaseCAD&lt;T&gt;().Excluir(registro);<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0<\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong><span style=\"color: #ff0000;\"><strong>***************************************<\/strong><\/span><\/strong><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong><span style=\"color: #ff0000;\"><strong>\u00a0<\/strong><\/span><\/strong><\/span><\/p>\n<p>A classe <strong><em>BaseCLN<\/em> <\/strong>permite realizar as principais opera\u00e7\u00f5es com qualquer entidade do sistema. Por exemplo: se quero consultar uma entidade <em><strong>Cliente<\/strong> <\/em>atrav\u00e9s do seu ID, podemos usar o m\u00e9todo <em>VerRegistroPorCodigo<\/em> da seguinte forma:<\/p>\n<p><strong>BaseCLN&lt;Cliente&gt; base = new BaseCLN&lt;Cliente&gt;();<\/strong><\/p>\n<p><strong>Cliente cliente = base.VerRegistroPorCodigo(1);<\/strong><\/p>\n<p>onde o valor 1 (um) \u00e9 o valor do Id no registro que est\u00e1 no banco de dados, e o retorno \u00e9 o objeto cliente preenchido com todos os artributos que retornaram do banco de dados.<\/p>\n<p>Estas duas classes devem ser criadas no projeto HLMI.Cadastro.CAD, e podemos criar outras classes que herdam de <em><strong>BaseCLN<\/strong> <\/em>para acesso aos dados das entidades. Por exemplo: caso eu queira criar uma consulta espec\u00edfica para <em><strong>Cliente<\/strong><\/em>, ent\u00e3o devo criar a classe <em><strong>ClienteCLN<\/strong> <\/em>(observe a nomenclatura) que herda de <strong><em>BaseCLN<\/em><\/strong>, da seguinte forma:<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\"><strong>*********** ClienteCLN *******************<\/strong><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong>\u00a0<\/strong><\/span><\/p>\n<p><span style=\"color: #000080;\">using System.Collections.Generic;<\/span><\/p>\n<p><span style=\"color: #000080;\">using System.Linq;<\/span><\/p>\n<p><span style=\"color: #000080;\">using HLMI.Cadastro.CES;<br \/>\n<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #000080;\">namespace HLMI.Cadastro.CLN<\/span><\/p>\n<p><span style=\"color: #000080;\">{<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 public class ClienteCLN : BaseCLN&lt;Cliente&gt;<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 {<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 public List&lt;Cliente&gt; VerRegistro(Cliente registro)<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 {<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 List&lt;Cliente&gt; consulta = this.ListarTodos();<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (registro.Id &gt; 0)<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 consulta = consulta.Where(c =&gt; c.Id == registro.Id).ToList();<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (!string.IsNullOrEmpty(registro.NomeCliente))<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 consulta = consulta.Where(c =&gt; c.NomeCliente.Contains(registro.NomeCliente)).ToList();<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (!string.IsNullOrEmpty(registro.Endereco))<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 consulta = consulta.Where(c =&gt; c.Endereco.Contains(registro.Endereco)).ToList();<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return consulta.ToList();<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0 \u00a0 }\u00a0 <\/span><\/p>\n<p><span style=\"color: #000080;\">}<\/span><\/p>\n<p><span style=\"color: #000080;\">\u00a0<\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong>***************************************<\/strong><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong>\u00a0<\/strong><\/span><\/p>\n<p>O m\u00e9todo <em>VerRegistro<\/em> \u00e9 um m\u00e9todo exclusivo da classe <em><strong>ClienteCLN<\/strong><\/em>, que auxilia na consulta ao cliente pelo nome ou pelo endere\u00e7o, se estiverem preenchidos. Ou seja, em um formul\u00e1rio de consulta, este m\u00e9todo retorna uma lista de acordo com os campos informados no formul\u00e1rio (digamos que sejam apenas dois: nome e endere\u00e7o).<\/p>\n<p><span style=\"color: #ff0000;\"><span style=\"color: #ff0000;\"><span style=\"color: #000000;\">Podemos observar que as classes usadas para a camada de l\u00f3gica de neg\u00f3cios (CLN) s\u00e3o similares \u00e0s classes usadas na camada CAD, entretanto o desenvolvedor deve ter em mente que as classes da camada CAD devem ser usadas apenas para permitir a comunica\u00e7\u00e3o das demais camadas com o banco de dados, enquanto que a camada CLN fica respons\u00e1vel por conter as classes que tratam as informa\u00e7\u00f5es que s\u00e3o recebidas ou exibidas na camada de interface do usu\u00e1rio (CIA).<\/span><\/span><strong><span style=\"color: #ff0000;\"><strong><br \/>\n<\/strong><\/span><\/strong><\/span><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste artigo vamos conhecer as classes que s\u00e3o respons\u00e1veis pela base das demais classes respons\u00e1veis pela l\u00f3gica de neg\u00f3cios, realizando a cria\u00e7\u00e3o, atualiza\u00e7\u00e3o, exclus\u00e3o e consulta dos registros, atrav\u00e9s dos objetos que representam as tabelas do banco (entidades), ou tratando [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[30],"tags":[],"class_list":["post-46","post","type-post","status-publish","format-standard","hentry","category-net"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4cTO8-K","jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/46","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=46"}],"version-history":[{"count":2,"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/46\/revisions"}],"predecessor-version":[{"id":108,"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/46\/revisions\/108"}],"wp:attachment":[{"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=46"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=46"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hectordufau.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=46"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}