Olá Pessoal,

Estou criando um modelo de crud utilizando o Linq. Tenho pesquisado no google muitas sugestões, mas gostaria de ver com o pessoal daqui, se alguém já teve a oportunidade de criar algo nesse sentido, e se poderia disponibilizar para a lista ou indicar fontes onde se possa pesquisar a respeito.

Abaixo, envio o que foi criado por mim, no intuito de validar com todos e em caso de estar bom, compartilhar a solução com a lista.

É uma classe da camada de acesso a dados, que herda de uma classe base onde declaro e instancio o DBDataContext e implemento uma interface com as assinaturas dos métodos de crud.

Interface:
--------
public interface IRepository
{
T Find(int id);
IList FindAll();
void Remove(T entidade);
void Insert(T entidade);
void Update(T entidade);
}

Classe Base:
----------
public class BaseDO
{
private DBDataContext dbLinq = new DBDataContext();

public DBDataContext DBLinq
{
get
{
return dbLinq;
}
}
}

Método da camada Data Object para a entidade CLIENTE:
----------------------------------------------

public partial class ClienteDO : BaseDO, IRepository
{
///
/// Método Find
///
/// Id da entidade /// Entidade
public CLIENTE Find(int id)
{
return base.DBLinq.CLIENTEs.Where(o => o.ID_CLIENTE == id).Single();
}

///
/// Método FindAll
///
/// Lista de entidades
public IList FindAll()
{
return base.DBLinq.CLIENTEs.ToList();
}

///
/// Método Remove
///
/// Entidade a ser removida public void Remove(CLIENTE entidade)
{
base.DBLinq.CLIENTEs.DeleteOnSubmit(entidade);
base.DBLinq.SubmitChanges();
}

///
/// Método Insert
///
/// Entidade a ser inserida public void Insert(CLIENTE entidade)
{
base.DBLinq.CLIENTEs.InsertOnSubmit(entidade);
base.DBLinq.SubmitChanges();
}

///
/// Método Update
///
/// Entidade a ser atualizada public void Update(CLIENTE entidade)
{
var tabela = base.DBLinq.GetTable();
tabela.Attach(entidade);
base.DBLinq.Refresh(RefreshMode.KeepCurrentValues, entidade);
base.DBLinq.SubmitChanges();
}
}

Abraços,
Marcelo de Oliveira.

Exibições: 349

Respostas a este tópico

Boa tarde Marcelo,
Confesso que ainda não trabalhei com LINQ mas em uma época que estava tentando entender como funcionaria a separação em camadas utilizando linq achei o artigo do link abaixo:

http://msdn.microsoft.com/en-us/magazine/cc700340.aspx

Ele não é feito com Linq to SQL, mas sim com Linq to Entity

Espero que este artigo possa lhe ajudar.

[]'s,
Fernando Gonçalves
Boa tarde Marceo, trabalho com LINQ to SQL desde o lançamento (heheheh) o modelo descrito por ti se parece bastante com o Meu, a grande diferença entre o seu e o meu, é que no seu caso vc passa o objeto inteiro e no meu caso eu passo os parametros pra poder esta utilizando os controle do Vs pra fazer insersões, e update, como FormView, GridView, etc.. e faço todo o todo o tipo de movimentação através de ObjectDataSource.

Exemplo de Update:
[DataObjectMethod(DataObjectMethodType.Update, true)]
public void Uptade(int id, string categoria)
{
try
{
using (_dc)
{
AcervoCategoria d = _dc.AcervoCategorias.SingleOrDefault(c => c.id == id);

_sb.Append("Alterou a Categoria do Acervo
");
if (!Equals(d.categoria, categoria))
{
_sb.AppendFormat("Categoria - Atual-[{0}] -> Novo-[{1}]
", d.categoria, categoria); d.categoria = categoria;
}

new Log().Insert(_sb.ToString());
_dc.SubmitChanges();
}
}
catch (Exception ex)
{
Erro(ex);
throw;
}
}
Ola Marcelo,
Já venho trabalhando e estudando um pouco de Linq-to-Entity (EF - Entity Framework) desde a versão beta. A sua iniciativa é muito valorada em está publicando e compartilhando suas conquistas, contudo na minha humilde opnião, eu não vejo como boa prática o seu objeto de negócio acessar o repositório, ou seja, a sua classe ClienteDO possuir implementações dos métodos da Interface IRepository. O que você poderia fazer é criar uma estrutura de classe que seja uma implementação do seu IRepository e essa nova classe possa receber um objeto padrão das suas classes DO e possa persistir seus objetos, como é o caso do Linq ou Entity.

Onde no EF, temos algo como:

SEU_CONTEXTO ctx = SEU_CONTEXTO.Context;//)
try
{
ctx.AddToCustomers(customers);
ctx.SaveChanges();
}
catch (Exception ex)
{
throw ex;
}

Como você pode perceber, o objeto responsável pela persistência da classe Customers é o contexto e não a própria classe Customers.

Espero ter ajudado.
Olá José Roberto,

Ficou bem clara sua sugestão, a questão da divisão das responsabilidades; a "linha" que separa a "camada de negócios" do reponsável pela persistencia dos dados, "camada de acesso a dados".

Com objetivo de tornar mais proveitosa ainda essa discursão, me responda por gentileza: Pode citar exemplos práticos, das consequências que podem ser geradas, quando não se adota a "boa prática" que vc está sugerindo? Ou seja, se o nosso colega Marcelo Oliveira insistir em implementar a interface IRepository em suas classes de negócio (se ClienteDO for realmente uma classe de negócio), quais os problemas ele pode ter no futuro? Problemas de arquitetura? Impactos sobre manutenções? Embaraçamento entre responsabilidades, ou seja, uma camada fazendo função da outra e vice-versa? Problemas na divisão física das camadas em diferentes equipamentos/máquinas? ... etc

;)
Muito bacana esta discussão Júlio Carvalho, entrando na via das boas práticas de programação e arquitetura de software vocês conhecem algum material voltado para .net?

Abraço
Olá Amigos,

Apenas para esclarecer e melhorar o papo, complemento que no meu exemplo, a classe ClienteDO pertence a uma camada de acesso a dados. Nessa camada ou projeto, se encontra meu arquivo OR/M dbml, assim como a classe base e a interface, assim como todas as classes crud.

Meu projeto contém algumas camadas, como a de interface, a de negócios, uma camada de apoio, com classes que servem a todas as camadas (conhecida comumente como "Util") e uma camada de transporte, com classes que encapsulam atributos e propriedades que representam as entidades de banco.

Essa camada de transporte, é utilizada para transportar os dados até a camada de interface, e podem ser complementadas com outros atributos caso necessário, pois utilizam o recurso "partial".

Para facilitar o desenvolvimento do projeto, utilizo o MyGeneration para criar as minhas classes de transporte e as minhas classes crud linq to sql, de forma a não precisar criar manualmente. Acelera muito o desenvolvimento !!!

A idéia dessa discussão seria de obter junto aos colegas da lista as opiniões sobre a minha solução, e saber mais sobre o que pode ser feito no sentido de melhorar. Confesso que gostei do que li até o momento, mas como não tenho tido muito tempo pra estudar a fundo o recurso Linq to Entity, achei a solução apresentada por mim algo que atendeu bem, pois me parece de fácil manutenção, de certa forma bem organizada e conceitualmente correta, pois não vejo nela uma mistura de responsbilidades, pois cada camada executa apenas aquilo que se propoe.

Uma dúvida que tenho é com relação a situações onde eu venha a trabalhar com transação e acesse mais de uma entidade de banco, e execute muitas operações, como inserts e updates dentro de um único processamento. Ainda não cheguei a desenvolver e agradeceria a todos qualquer contribuição nesse sentido. :)

Abraço forte a todos,
Marcelo Oliveira.
[Lucas]

Hehehe,
Lucas, bacana mesmo a "DISCUSSÃO". Quando eu vi já tinha passado os 15min para edição. =x

Creio que esse site possa nos ajudar:
http://msdn.microsoft.com/en-us/practices/default.aspx

Lucas disse:
Muito bacana esta discussão Júlio Carvalho, entrando na via das boas práticas de programação e arquitetura de software vocês conhecem algum material voltado para .net?

Abraço

[Fernando Gonçalves]

Caramba, muito bom esse artigo: http://msdn.microsoft.com/en-us/magazine/cc700340.aspx
Obrigado por compartilhar.
Marcelo, dá uma olhada, baixa o exemplo, acho q pode te clariar, e surgir mais ideias para o seu modelo.

[Marcelo Oliveira]
Eu li o ultimo post. O dia hoje está apertado para mim, a noite eu leio novamente com mais calma, e tento contribuir. Transações realmente tem que tratar com cuidado, já tive problemas gigantescos com isso, tem que ver seus se seus serviços serão pesados, buscar minimizar o tempo em que as transações ficam em aberto, trabalhar as querys para não ficarem em travadas nos momentos de transações, etc...
Uma dúvida que tenho é com relação a situações onde eu venha a trabalhar com transação e acesse mais de uma entidade de banco, e execute muitas operações, como inserts e updates dentro de um único processamento. Ainda não cheguei a desenvolver e agradeceria a todos qualquer contribuição nesse sentido. :) Marcelo Oliveira

Sumi uns dias, mas não esqueci, até pq tb me interessa. Sobre as transações:

Post MSDN: Pessimistic concurrency in LINQ to Entity?
http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframew...

Documentação: TransactionScope Class
http://msdn.microsoft.com/en-us/library/system.transactions.transac...(VS.80).aspx

Artigo: Getting LINQ to SQL and LINQ to Entities to use NOLOCK (Importante, principalmente quando se tem transações com longa duração)
http://www.hanselman.com/blog/GettingLINQToSQLAndLINQToEntitiesToUs...

Sei que já passou bastante tempo. Espero que ainda seja útil.
Não sei se ainda vai servir para o problema do Marcelo, mas como ajuda para estudo este material com certeza vai ajudar e muito.

Obrigado.

[]'s,
Fernando Gonçalves

Júlio Carvalho disse:
Uma dúvida que tenho é com relação a situações onde eu venha a trabalhar com transação e acesse mais de uma entidade de banco, e execute muitas operações, como inserts e updates dentro de um único processamento. Ainda não cheguei a desenvolver e agradeceria a todos qualquer contribuição nesse sentido. :) Marcelo Oliveira

Sumi uns dias, mas não esqueci, até pq tb me interessa. Sobre as transações:

Post MSDN: Pessimistic concurrency in LINQ to Entity?
http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframew...

Documentação: TransactionScope Class
http://msdn.microsoft.com/en-us/library/system.transactions.transac...(VS.80).aspx

Artigo: Getting LINQ to SQL and LINQ to Entities to use NOLOCK (Importante, principalmente quando se tem transações com longa duração)
http://www.hanselman.com/blog/GettingLINQToSQLAndLINQToEntitiesToUs...

Sei que já passou bastante tempo. Espero que ainda seja útil.

RSS

© 2019   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço