LINQ to SQL e aplicações multi-camadas

Email

Estou escrevendo um artigo para a .Net Magazine e resolvi usar em um dos exemplos a persistência "pré-fabricada" do LINQ to SQL. Até aí tudo bem, mas qual não foi minha surpresa ao perceber que não há muito suporte de LINQ to SQL para programação multi-camadas. Já repararam que todos os exemplos que vemos com LINQ to SQL estão usando sempre 2 camadas (apresentação e banco de dados)?

Descobri que algumas pessoas já estão reclamando disso a algum tempo. Alguns artigos que li sugerem o uso de uma camada adicional de abstração, algo sugerido pelo próprio Scott Guthrie da Microsoft em seu blog, onde ele também comenta que vai fazer um post sobre n-camadas e LINQ to SQL, que até agora eu não vi (ele comenta novamente, dessa vez no próprio post, aqui).

Isso tudo é muito estranho. Uma das coisas que senti falta foi a possibilidade de separar as entidades de negócio do código de acesso a dados, algo que o Visual Studio 2008 já oferece para os Datasets tipados:

DatasetEmOutroProjetoVS2008  

Porque não oferecer o mesmo suporte ao LINQ to SQL? Procurei bastante, mas não encontrei nada parecido no Designer:

LINQToSQLSemOutroProjetoVS2008 

Outro problema encontrado foi a utilização de um objeto modificado com outra instância de datacontext. Tudo indica que não funciona…

Vou procurar um pouco mais e ver no que dá. Se encontrar solução coloco por aqui.

Email
Esse post foi publicado em Sem categoria e marcado por Giovanni Bassi. Marcar link permanente.

Sobre Giovanni Bassi

Arquiteto e desenvolvedor, agilista, pai, filho, namorado, escalador, provocador.
Programa porque gosta, e começou a trabalhar com isso porque acha que trabalhar como administrador é meio chato. Por esse motivo sempre diz que nunca mais vai virar gerente de ninguém. E também porque acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é melhor que hierarquia. Mas isso é outro assunto.
Foi reconhecido  Microsoft MVP depois que alguém notou que ele não dormia a noite pra ficar escrevendo artigos, cuidando e participando do .Net Architects, gravando o podcast Tecnoretórica, escrevendo posts no blog e falando o que bem entende no twitter @giovannibassi. E por falar nisso é no twitter que conta pra todos que gerencia de projetos deve ser feita pelo time e não por um gerentes, que greves em TI são coisas sem sentido e que stored procedure com regras de negócio são malígnas.
Você já deve ter percebido (até porque está lá na primeira frase) que Giovanni é agilista. De tanto gostar disso ele trouxe os programas de certificação e treinamento  PSD e PSM da Scrum.org pro Brasil, e por causa deles, do MVP e de algum trabalho que aparece tem que ficar indo pros EUA de vez enquando, coisa que prefere não fazer. (É bem comum você ouvir ele perguntando porque a Scrum.org e a Microsoft não estão na Itália, por exemplo.)
Junto com alguns Jedis criou a Lambda3, que, apesar de ser pequena e de não ser muito comum no Brasil, insiste em fazer projetos e consultoria direito. Por causa da Lambda3 ele tem trabalhado mais do que quando era consultor independente, mas menos do que a maioria das pessoas. Quer dizer, isso se você considerar que os trabalhos junto à comunidade não são trabalho, caso contrário ele trabalha mais que a maioria das pessoas.
Recentemente ele resolveu que merecia viver melhor e ganhar uns anos de vida e desistiu de ser sedentário, fazendo algum barulho de vez em quando com os amigos no twitter com a hashtag #DotNetEmForma. Por causa do convite recente de amigos do lado Open Source (que ele respeita e admira), começou a escalar, e agora está sempre com as mãos machucadas. Mas ainda dá pra programar. Você encontra ele sempre em algum evento, como o TechEd, e o DNAD, mas também outros menos comuns para o pessoal do .NET, como a RubyConf. Nesses eventos, ou ele está vendo palestras, ou batendo papo com alguém, ou codando alguma aplicação que alguém achou que dava pra fazer durante o evento.
  • Michel Magalhães

    Rapaz, ele realmente não atualiza um outro objeto que foi modificado por outro datacontext, o que dificulta o desenvolvimento em camadas.

    Uma maneira de fazer isto, é adicionando um campo nas tabelas do tipo "timestamp", configurar a propriedade na entidade e em seguida utilizar o método "Atach(Entity,true)", porém, se seu objeto não foi modificado ele fará o update da mesma forma. :(

    Tentei também utilizar o evento "PropertyChanged", com o intuito de verificar se o objeto foi modificado para então chamar o Atach,mas também não funcionou.

    Outra alternativa é fazer via reflection, percorrer as propriedades e setar as atualizações.

    Pelo que estou entendendo o DataContext está funcionando também como uma espécie de "Observador" onde ele é informado das modificações que acontecem nas entidades que ele "esta de olho" (Observado).

    Bom, eu também estou a procura, se tiverem alguma solução…..

  • Elizeu

    Giggio, antes de mais nada quero parabeniza-lo pelo conteudo no site.
    Com relacao ao Linq to Sql realmente o material é escasso, estou desenvolvendo um projeto utilizando ASP.NET MVC, e para a persistencia estou tentando utilizar o Linq to SQL, porem ainda nao obtive sucesso.
    Uma deixa aí é abordar mais sobre Persistencia de Dados.
    Abraço…..

  • Tarcisio

    Qual é a edição da Revista que saiu este artigo ?

  • http://unplugged.giggio.net/ Giovanni Bassi

    Pessoal, acabou não entrando no artigo. Em breve vai sair um artigo meu detalhando bem o uso do MVC em uma arquitetura do mundo real na .Net Magazine, aguardem!

  • Marcos

    Existe previsão de quando irá sair o artigo?

  • http://unplugged.giggio.net/ Giovanni Bassi

    Marcos, provavelmente no fim do ano, ou começo de janeiro.

  • alessandro

    Pessoal,
    achei este link: http://iridescence.no/post/Linq-to-Sql-Programming-Against-an-Interface-and-the-Repository-Pattern.aspx

    Parece dar uma luz.

    De qualquer forma, uma alternativa que achei foi na camada de persistência fazer um clone da entidade do LINQ e gravar e atualizar ela com base na entidade passada como parametro. É estranho, mais foi o jeito mais simples que encontrei.

    t+

  • http://discountgenuinewatches.biz/ Andy Warhol

    Hey I love your style I will subscribe for your feed please keep posting!

  • http://theluxurywatchstore.biz/colibri/colibri-pocket-watch-hunting-case-moon-phase-day-date-dial-goldtone-wooden-box-pws095887x/ Colibri Pocket Watch Hunting

    Very interesting topic will bookmark your site to check if you write more about in the future.

  • http://theswisswatch.biz/police/police-pl10977ms02a/ Police Pl10977ms02a

    Do you earn decent money from this blog or are you doing it just for fun?