VB 2008 - Criando uma aplicação completa com LINQ To SQL II


Na primeira parte do artigo -  VB 2008 - Criando uma aplicação completa com LINQ To SQL - I -  definimos nosso objetivo e preparamos todo o ambiente criando as stored procedures e efetuando o mapeamento objeto relacional via LINQ To SQL. Vamos agora criar a nossa camada de negócios com os métodos que serão usados na manutenção da tabela Shippers.

Se você tem acompanhado meus artigos percebeu que ultimamente eu tenho tratado muito do acesso a dados em camadas onde geralmente adotamos a estratégia de trabalhar com camadas usando a separação lógica da camada de apresentação, camada de acesso a dados e camada de negócios.

A camada de acesso a dados é responsável pelo acesso e manutenção dos dados, nesta camada criamos os métodos onde definimos, abrirmos e fechamos a conexão com o banco de dados, além de métodos para obter os dados e realizar as operações (CRUD): criar, remover, alterar e deletar informações da fonte de dados. Esta camada recebe a solicitação , acessa os dados e efetua a operação devolvendo o resultado.

Como já efetuamos o mapeamento objeto relacional via LINQ To SQL temos os objetos do banco de dados mapeados para as classes das entidades, no caso a tabela Shippers e as stored procedures. Na figura abaixo temos o descritor LINQ exibindo visualmente os objetos mapeados a partir do banco de dados:

O arquivo Shippers.dbml representa o DataContext que é a fonte de todas as entidades mapeadas sobre a conexão do banco de dados e efetua o tratamento das alterações feitas para todas as entidades mantendo um cache de entidades que garante que as entidades retornadas mais que uma vez são representadas usando a mesma instância de objeto.

Vamos então criar uma classe chamada BAL no projeto clicando com o botão direito do mouse sobre o nome do projeto se selecionando a opção Add-> New Item e a seguir selecionando o template Class e informando o nome BAL.vb.

O que temos que fazer agora ?

Lembra que no primeiro artigo criamos as stored procedures ? Vamos relacioná-las apenas para você lembrar:

As stored procedures irão efetuar as operações no banco de dados e serão chamadas na nossa camada de negócio. Dessa forma para cada uma das tarefas a serem realizadas iremos criar um método que usa a respectiva stored procedure. Então iremos criar na camada de negócios - BAL - os seguintes métodos:

Não , não houve um erro de digitação no nome dos métodos eu apenas resolvi usar o mesmo nome dados as stored procedures mas isso não é obrigatório, fiz isso para ajudar a identificar melhor o relacionamento do método e da stored procedure usada.

Eu irei criar métodos públicos e estáticos, ou métodos de classe, como você ja deve saber, não precisamos criar uma instância da classe para acessar estes métodos. Na linguagem Visual Basic métodos estáticos são criados usando o modificador Shared. Criando um método público ele será acessível de qualquer lugar do nosso projeto.

Vamos começar com o método para listar todos os dados da tabela Shippers, o método ListShippers(). Eu vou explicar em detalhes este método preste atenção pois não vou repetir a explicação para os outros métodos.

Esse método não recebe nenhum parâmetro, ele apenas acessa a tabela e lista todos os entregadores(Shippers)

Ele vai fazer uma chamada a stored procedure ListShippers. Essa stored procedure é que vai acessar a tabela e selecionar os dados. Veja como ela foi definida na sua criação:

ListShippers
CREATE PROCEDURE ListShippers
AS
SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers
GO

E como iremos efetuar o acesso a essa stored procedure ?

Vamos usar o mapeamento O/R criado pelo LINQ To SQL. Para isso devemos criar uma instância da classe Shippers.dbml, fazendo isso teremos acesso a todos os objetos mapeados do banco de dados. Então primeiro vamos definir a assinatura do método:

Public Shared Function ListShippers()

e a seguir criar a instância da classe DataContext:

Dim db As New ShippersDataContext

- Aqui o banco de dados é mapeado em um DataContext permitindo acesso a tabelas de forma transparente sem nos preocuparmos com conexão. O DataContext utiliza a interface IDbConnection do ADO.NET para acessar o armazenamento e pode ser inicializado tanto com um objeto de conexão ADO.NET estabelecido ou com uma string de conexão que possa ser utilizada para criar a conexão.

Agora já temos condições de acessar o método ListShippers que foi mapeado pelo LINQ To SQL. Vamos neste momento usar uma consulta LINQ:

Dim shippers = From s In db.ListShippers

Esta é nossa consulta LINQ, vamos a ela:

A consulta LINQ To SQL, ao contrário de uma instrução SQL, inicia com a cláusula From; um dos motivos desta inversão de ordens é o uso recurso IntelliSense, pois quando você indica primeiro a origem dos dados ele pode mostrar as listas de membros de tipos nos objetos em sua coleção.

Outro motivo , segundo Anders Hejlsberg , seria que esta ordem esta mais próxima da nossa lógica de pensamento. Quando você digita uma instrução SQL iniciando com Select na verdade você já esta pensando na origem dos dados , condições , agrupamentos. etc.

A cláusula From é a mais importante do LINQ To SQL pois é usada em todas as consultas. Uma consulta deve sempre começar com From. (O Select pode estar implícito o From não.)

Este código define a variável shippers, note que o compilador esta inferindo o tipo da variável pois ela não foi declarada no código.

Este é um dos novos recursos do .NET Framework 3.5 , a inferência de tipos, que ocorre quando não há declaração explícita do tipo do objeto e o compilador descobre e atribui o tipo correto ao objeto declarado; é o que acontece neste caso.

Através do objeto db instanciado do tipo DataContext temos acesso ao método ListShippers mapeado no descritor LINQ quando arrastamos a stored procedure ListShippers para o descritor.

Finalmente retornamos os resultado como uma lista usando o operador ToList.(O operador ToList cria uma lista List<T> contendo os elementos de uma sequência.)

Return shippers.ToList

O código completo do método é o seguinte:

 Public Shared Function ListShippers()
        Dim db As New ShippersDataContext
        Dim shippers = From s In db.ListShippers
        Return shippers.ToList
    End Function

Como os demais métodos a serem criados apresentam o mesmo ciclo de operações e usam praticamente o mesmo código descrito acima, desta forma irei apenas apresentar os demais métodos sem maiores detalhes:

Nota: Para os demais métodos a única diferença é a utilização de parâmetros que serão usados pelas stored procedures criadas para realizarem as operações no banco de dados.

Public Class BAL

    Public Shared Function ListShippers()
        Dim db As New ShippersDataContext
        Dim shippers = From s In db.ListShippers
        Return shippers.ToList
    End Function

    Public Shared Sub AddShippers(ByVal companyName As String, ByVal phone As String)
        Dim db As New ShippersDataContext
        db.AddShippers(companyName, phone)
    End Sub

    Public Shared Sub UpdateShippers(ByVal companyName As String, ByVal phone As String, ByVal shipperID As Integer)
        Dim db As New ShippersDataContext
        db.UpdateShippers(shipperID, companyName, phone)
    End Sub

    Public Shared Sub DeleteShippers(ByVal shipperID As Integer)
        Dim db As New ShippersDataContext
        db.DeleteShippers(shipperID)
    End Sub

    Public Shared Function SearchShippers(ByVal companyName As String)
        Dim db As New ShippersDataContext
        Dim shippers = From s In db.SearchShippers("%" & companyName & "%")
        Return shippers.ToList
    End Function

End Class

Percebeu como o código ficou mais limpo e fácil de entender...

Abaixo temos a representação das camadas existentes na aplicação sendo que camada de negócios BLL (que chamamos de BAL) torna transparente a camada de acesso a dados - DAL através do mapeamento O/R realizado via LINQ To SQL sendo assim responsável por retornar os resultados das operações solicitadas via interface.

Agora só falta criar a camada de interface , que no nosso caso será uma aplicação Windows, que será responsável pela interação com o usuário. 

Aguarde a continuação do artigo em : VB 2008 - Criando uma aplicação completa com LINQ To SQL - III


José Carlos Macoratti