Façade

1 view
Skip to first unread message

Koga, Diego

unread,
Jun 24, 2009, 8:07:18 AM6/24/09
to dotnetar...@googlegroups.com
Bom dia galera!

Surgiu a necessidade de relacionar objetos, mais ou menos a ideia de Pedido e Item, onde eu preciso chamar o método Salvar() destes dois objetos em um único botão, sendo assim criaria um Façade que faria esse trabalho.

Acredito que esta necessidade seja resolvida com o Façade e o controle de trasanção ficaria nele.

Agora, qual seria a melhor forma de organizar isso? Criar um outro projeto (Façade) dentro da minha solution ou deixar o Façade dentro do Model?

Outra dúvida é: Como garantir que um futuro programador não irá replicar o código do Façade em outro lugar (até mesmo na tela)?



[]´s
------------------
Koga, Diego

Rodrigo Vieira

unread,
Jun 24, 2009, 8:17:16 AM6/24/09
to dotnetar...@googlegroups.com
Quanto à ultima pergunta, acho que a forma mais eficiente de garantir
isso é organizar os projetos e atributos de visibilidade dos métodos
(internal, protected etc) de forma que o desenvolvedor nem sequer veja
os métodos que não deve usar no projeto de UI.

2009/6/24 Koga, Diego <dik...@gmail.com>:

Koga, Diego

unread,
Jun 24, 2009, 8:25:45 AM6/24/09
to dotnetar...@googlegroups.com
Rodrigo,

Como eu posso proteger estes métodos se preciso consumí-lo no meu Façade?


[]´s
------------------
Koga, Diego



2009/6/24 Rodrigo Vieira <rodr...@gmail.com>

Fábio Serratto - Gmail

unread,
Jun 24, 2009, 8:32:55 AM6/24/09
to dotnetar...@googlegroups.com

Coloca o Façade no mesmo assembly e expõe só os métodos do Façade

 

Fábio Serratto

http://serratto.spaces.live.com/

Microsoft Certified Professional Developer: Web Developer

Microsoft Certified Technology Specialist: Microsoft .NET Framework - Web Applications

Microsoft Certified Application Developer: For Microsoft .Net

Microsoft Certified Professional

Microsoft Certified Trainer

Gerente de Negócios e Tecnologia

IT Extreme Consultoria e Desenvolvimento de Sistemas Ltda

 

"Aprender é a unica coisa de que a mente nunca se cansa, nunca tem medo e nunca se arrepende." (Leonardo da Vinci)

Rodrigo Vieira

unread,
Jun 24, 2009, 8:34:20 AM6/24/09
to dotnetar...@googlegroups.com
Uma forma de fazer isso seria assim:

Vc teria 2 projetos separados, um pra UI, um outro pras suas classes e façades;

O metodo Salvar() do Facade seria public, logo, seria acessivel no
projeto de UI. Já o método Pedido.Salvar() seria internal, então ele
seria visivel para a Façade (afinal eles estão no mesmo projeto) mas
não para a UI.

Koga, Diego

unread,
Jun 24, 2009, 8:38:56 AM6/24/09
to dotnetar...@googlegroups.com
Rodrigo,

Entendi perfeitamente, mas temos como premissa que o Façade está no mesmo projeto como disse o Fabio, mas esta é uma prática recomendada?

Rodrigo Vieira

unread,
Jun 24, 2009, 9:56:33 AM6/24/09
to dotnetar...@googlegroups.com
Diego, acho que o que o Fabio disse foi o mesmo que eu disse: Facade e
Mode num projeto, UI em outro.

Tb acho que colocar UI num assembly/projeto à parte é uma prática bem
comum, facilita a organização, atualizações etc.

Fábio Serratto - Gmail

unread,
Jun 24, 2009, 10:35:02 AM6/24/09
to dotnetar...@googlegroups.com
É exatamente isso, trabalho nesse formato já faz um bom tempo e não tenho
tido problemas


Fábio Serratto
http://serratto.spaces.live.com/
Microsoft Certified Professional Developer: Web Developer
Microsoft Certified Technology Specialist: Microsoft .NET Framework - Web
Applications
Microsoft Certified Application Developer: For Microsoft .Net
Microsoft Certified Professional
Microsoft Certified Trainer
Gerente de Negócios e Tecnologia
IT Extreme Consultoria e Desenvolvimento de Sistemas Ltda

"Aprender é a unica coisa de que a mente nunca se cansa, nunca tem medo e
nunca se arrepende." (Leonardo da Vinci)


-----Mensagem original-----
De: dotnetar...@googlegroups.com
[mailto:dotnetar...@googlegroups.com] Em nome de Rodrigo Vieira
Enviada em: quarta-feira, 24 de junho de 2009 10:57
Para: dotnetar...@googlegroups.com
Assunto: [dotnetarchitects] Re: Façade


Koga, Diego

unread,
Jun 24, 2009, 10:45:27 AM6/24/09
to dotnetar...@googlegroups.com
A UI está em outro projeto msm...

E como vcs sugeriram, irei colocar o Façade dentro do Model, deixarei os métodos/classes como Internal ou Protected, e ao fazer isso, preciso expor os métodos no Façade.

Mas como utilizar bem o Façade, sendo que já ví projetos com diversos tipos de desenvolvimento do Façade, por exemplo:

1- No padrão Singleton, que recebia os dois objetos relacionados, [ex: Facade.Instance.Salvar(pedido, itens)]

2- Onde o Façade era uma classe composta destes de dois ou mais objetos, neste caso teria dentro dele um Pedido e uma List<ItemPedido>

3- E ainda um outro terceiro que o Façade herda a classe de origem e compõe a auxiliar, nesta caso, herdaria Pedido e comporia List<ItemPedido>


Dando uma "googlada", não achei nada que fala sobre isso, mas ví mto exemplo da utilização 1... Ao meu ver, eu ficaria entre a 2 e a 3, o que costumam fazer?


[]´s
------------------
Koga, Diego



2009/6/24 Fábio Serratto - Gmail <serr...@gmail.com>

Fábio Serratto - Gmail

unread,
Jun 24, 2009, 10:50:26 AM6/24/09
to dotnetar...@googlegroups.com

Costumo usar as 2 alternativas (2 e 3).

 

Tenho projetos que foram desenvolvidos usando a arquitetura 2 e outros com a 3, mas sempre métodos Static.

 

Fábio Serratto

http://serratto.spaces.live.com/

Microsoft Certified Professional Developer: Web Developer

Microsoft Certified Technology Specialist: Microsoft .NET Framework - Web Applications

Microsoft Certified Application Developer: For Microsoft .Net

Microsoft Certified Professional

Microsoft Certified Trainer

Gerente de Negócios e Tecnologia

IT Extreme Consultoria e Desenvolvimento de Sistemas Ltda

www.itextreme.com.br

55 27 3237-0500

55 27 9252-7772

 

"Aprender é a unica coisa de que a mente nunca se cansa, nunca tem medo e nunca se arrepende." (Leonardo da Vinci)

 

PAntes de imprimir, pense em sua responsabilidade e compromisso com o meio ambiente. Não promova o desperdício. Uma campanha pelo uso correto do e-mail.

 

As informações existentes nessa mensagem e nos arquivos anexados são para uso restrito, sendo seu sigilo protegido por lei. Caso você não seja o destinatário, saiba que a leitura, a divulgação e a cópia são proibidas nesse caso. Favor apagar as informações e notificar o remetente. O uso impróprio será tratado conforme as normas da empresa e a legislação em vigor.

All information contained in this message and in the attached files is restricted, and its confidentiality protected by law. If you are not the addressee, be informed that reading, disclosing or copying such information is strictly prohibited. In this case, please delete the message and notify the sender. Unauthorized use of this information will be treated in accordance with the company's internal rules and applicable legislation.

Rodrigo Garcia

unread,
Jun 24, 2009, 4:45:09 PM6/24/09
to dotnetar...@googlegroups.com
Diego,
 
Concordo que colocar o façade no assembly do Model expondo seus métodos como publicos é mais fácil e prático, mas uma solução para a colocação abaixo (caso tivesse a necessidade do façade em um assembly separado), seria vc assinar o assembly do façade com uma strong name key, e então utilizar a diretiva de StrongNameIdentityPermission no assembly do model, permitindo assim aceesso somente ao assembly "assinado" com a strong name do façade.
 
[]s
 
Rodrigo Garcia

2009/6/24 Koga, Diego <dik...@gmail.com>



--
Att,

Rodrigo Garcia.

higor.cesar

unread,
Jun 25, 2009, 9:50:58 AM6/25/09
to .Net Architects
Fala galera,
eu uso um facade também. Entretanto criei um projeto facade e um
projeto para controle do negócio.
No meu caso o webUI possui referencia apenas para o projeto Facade. Eu
não usei herança, achei melhor
usar uma composição neste caso.
ps: Gostei da dica de chave na dll

http://www.programmingandliving.blogspot.com/

Plácido Bisneto

unread,
Jun 25, 2009, 2:20:43 PM6/25/09
to dotnetar...@googlegroups.com
Boa tarde Galera,

A um tempo atrás eu estava começando a ler sobre DDD e muitas dúvidas me surgiram na cabeça...
E uma delas foi exatamente sobre como e se a minha UI poderia acessar meu domínio. Acabei postando
uma entrada no fórum do MSDN (to procurando o link neste momento) e aos poucos foram me informando.

A pergunta é: Você realmente precisa esconder seus objetos de dominio? :)


Plácido Bisneto - .NET Developer
Blog: http://cidico.wordpress.com
OpenControls: http://opencontrols.codeplex.com


2009/6/25 higor.cesar <higo...@gmail.com>

Plácido Bisneto

unread,
Jun 25, 2009, 2:35:15 PM6/25/09
to dotnetar...@googlegroups.com
Boa tarde Diego,

Você está usando DDD no desenvolvimento desse software?!
Qual a sua necessidade de utilizar o Façade?


Plácido Bisneto - .NET Developer
Blog: http://cidico.wordpress.com
OpenControls: http://opencontrols.codeplex.com


2009/6/24 Koga, Diego <dik...@gmail.com>

Koga, Diego

unread,
Jun 25, 2009, 3:54:04 PM6/25/09
to dotnetar...@googlegroups.com
Boa tarde Plácido,

Não, não estou utilizando DDD...

Na verdade minha necessidade é relacionar estes objetos, para que eu tenha que chamar somente um método na tela para salvar os dois objetos.

A melhor maneira que conheço de fazer isso é utilizando o façade, existe alguma outra técnica?


[]´s
------------------
Koga, Diego



2009/6/25 Plácido Bisneto <placido...@gmail.com>

Plácido Bisneto

unread,
Jun 25, 2009, 4:01:02 PM6/25/09
to dotnetar...@googlegroups.com
Isso depende de como está exatamente sua estrutura.
Nada o impede de no seu método Salvar(), por exemplo, você chame métodos internos que façam validação, instanciação dos objetos de persistencia e etc.. 

Entendeu? :)

Plácido Bisneto - .NET Developer
Blog: http://cidico.wordpress.com
OpenControls: http://opencontrols.codeplex.com


2009/6/25 Koga, Diego <dik...@gmail.com>

Giovanni Bassi

unread,
Jun 25, 2009, 7:03:46 PM6/25/09
to dotnetar...@googlegroups.com
Diego,

Não precisa de DDD, talvez um padrão repositório aliado ao conceito de raizes de agregação resolva.
Pelo que entendi você está usando alguma coisa relacionada com Active Record, não é? O método de salvar está no próprio objeto, certo?
Nesse cenário, você pode esconder o método salvar deixando-o internal, como outros membros do grupo já falaram. E deixa um outro objeto fazer, algum coordenador. Pode ser um objeto de serviço, que representaria um façade.

Outra opção é você fazer o que citei no começo, mas se o projeto já estiver adiantado, talvez a mudança seria muito grande. Adicionar um repositório implicaria em separar o código de persistência e obtenção dos dados do objeto de domínio. Isso deixaria a cargo deste objeto esse trabalho de guardar coisas no BD. Juntando o conceito de raizes de agregação, você resolve o outro problema. Com raizes de agregação, a regra é que cada repositório é responsável por uma raiz. Um raiz é composta de objetos raiz e seus dependentes, e os objetos são dependentes se devem ser salvos juntos no BD. É o caso que você apresentou, com pedido e itens. A raiz seria o pedido. Os itens são dependentes. Você teria um único repositório responsável por todo o processo de salver o pedido.

Se precisar transacionar entre repositórios, e isso acontece, procure usar uma unit of work.

[]'s

Giovanni Bassi
Microsoft MVP, MCSD, MCPD, CSM
Arquiteto de software
http://www.giovannibassi.com


2009/6/25 Koga, Diego <dik...@gmail.com>

Koga, Diego

unread,
Jun 26, 2009, 8:56:27 AM6/26/09
to dotnetar...@googlegroups.com
Neste projeto, tem o Model, com seus métodos, salvar, carregar, etc...

Mas cada método destes objetos chama um método de persistência no DAL..

Eu fiz um façade, expus um método salvar dele, que chama o método dos dois objetos em questão! E coloquei o método salvar o objeto que está dentro do façade como internal...

Alguma outra idéia?

Irei dar uma olhada no padrão repositório que disse, se for o que estou pensando, acredito que já está assim...


[]´s
------------------
Koga, Diego



2009/6/25 Giovanni Bassi <gig...@giggio.net>
Reply all
Reply to author
Forward
0 new messages