Freigeben über


Façades e Singletons

Outro dia fiz um webcast sobre Entity Framework (EF). A idéia foi simples: apresentar os conceitos básicos do EF, os conceitos por traz do edm (Entity Data Model) e object context, e o como lidar com o EF numa arquitetura 3 camadas.

Utilizei como base um bom artigo do John Papa (ver), mas fiz questão de estendê-lo para incorporar um cenário que creio ser mais realista. Acrescentei as seguintes preocupações:

  • Como garantir que objetos distintos trabalhem com um mesmo edm/contexto? É comum uma thread chamar mais de um objeto ou método de negócio que necessitam trabalhar com o mesmo contexto. Como evitar a ostensiva passagem de contextos através de argumentos simplificando a programação?
  • Como garantir o uso de mais de um contexto/edm em uma mesma thread? É uma boa prática dividir seu modelo em sub-modelos. Um exemplo simples: é bom ter um sub-modelo de um contas a pagar e outro para o contas a receber. No entanto, um módulo gerencial pode precisar de ambos para calcular o estado financeiro da empresa. Para isto, necessitamos garantir que dois object contexts distintos trabalhem numa mesma transação.

Para lidar com estes problemas, minha sugestão é o uso coordenado de um façade e singletons. Explico:

Uma biblioteca implementa os singletons da thread. Assim, uma regra de negócio pede um contexto e a biblioteca o procura no dicionário da thread. Se não existir, o contexto é criado e inserido no dicionário da thread;

Ao façade cabem as missões de garantir:

  1. que o processo chamador tem direito de acesso;
  2. abrir/fechar a transação;
  3. instrumentar o início/fim da transação;
  4. persistir no banco de dados as mudanças dos objetos do EF;
  5. fechar todos os contextos abertos para liberar o espaço.

Que tal? Vocês compram?

Comments

  • Anonymous
    September 14, 2008
    Desde o começo de 2008 eu venho trabalhando em um projeto que usa o Linq to SQL como camada de persistência. Usamos também singletons para resolver esse problema. No entanto, armazenamos o data context via call/set context, dessa forma podemos usar a mesma estratégia para aplicações WEB e Desktop. Com o crescimento do nosso DBML estamos vendo a necessidade de quebrá-lo em vários pequenos DBMLs. Vou avaliar essa sugestão de usar um façade para isso. abraços, Cássio Rogério Eskelsen

  • Anonymous
    September 15, 2008
    The comment has been removed

  • Anonymous
    September 15, 2008
    Otavio, talvez. Qual o endereço do webcast? Quem sabe vendo mais concretamente eu consiga dar um feedback melhor.

  • Anonymous
    September 23, 2008
    Há um tempo estou devendo algumas dicas. Vamos a elas: Dois webcasts baixaram no DevCenter de arquitetura

  • Anonymous
    July 04, 2012
    qual o link deste web cast? ele foi salvo?

  • Anonymous
    July 04, 2012
    Procurei e não achei, Paulo :(