ASP .NET - Usando o NHibernate em uma aplicação Web II
Neste artigo veremos como usar o NHibernate em uma aplicação ASP .NET Web Forms. |
Na primeira parte deste artigo foram realizadas as seguintes tarefas:
Já temos portanto tudo pronto para usar os recursos do NHibernate em nossa aplicação ASP .NET e realizar as operações CRUD relacionadas com as manutenção das informações da tabela Usuario.
Nossa próxima tarefa é definir uma sessão NHibernate.
Mas afinal o que vem a ser uma sessão NHibernate ?
Pense em uma sessão NHibernate como uma ligação abstrata ou virtual de um conduto ou fio com o banco de dados.
Quando se usa o NHibernate não temos que nos preocupar em criar uma conexão, abrir a conexão, passar a conexão para o objeto Command e criar um DataReader a partir do objeto Command,etc.
Com o NHibernate o tratamento é diferente. Temos que solicitar um objeto Session para o SessionFactory e usar a sessão para realizar as operações CRUD.
O NHibernate trabalha com um mecanismo de sessão e para criar uma sessão usamos um objeto do tipo ISessionFactory do NHibernate.
Além de criar a sessão devemos tomar o cuidado de ela será inicializada apenas uma única vez durante a sessão do usuário na aplicação WEB para evitar degradação no desempenho da aplicação.
Para isso vamos definir uma classe chamada NHibernateHelper no projeto.
No menu Project selecione o item Add Class, selecione o template Class e informe o nome NHibernateHelper.vb;
A seguir vamos definir o seguinte código nesta classe:
Imports NHibernate Imports NHibernate.Cfg Public Class NHibernateHelper Private Shared
_sessionFactory As ISessionFactory Private Shared ReadOnly Property SessionFactory() As ISessionFactory
Get If _sessionFactory Is Nothing Then Dim configuration = New Configuration() configuration.Configure() configuration.AddAssembly(GetType(Usuario).Assembly) _sessionFactory = configuration.BuildSessionFactory() End If Return _sessionFactory End Get End Property Public Shared Function OpenSession() As ISession Return SessionFactory.OpenSession() End Function End Class
|
Note que temos a variável estática (shared) e privada _sessionFactory do tipo ISessionFactory.
É através desse objeto que iremos criar as sessões NHibernate e como ele é estático garantimos que a sessão será criada uma única vez.
O método SessionFactory é o método principal da classe sendo o responsável por criar o ISessionFactory e retorná-la.
No código verificamos se não existe uma sessão criada e em caso positivo criamos a sessão.
Na primeira execução do código teremos que criar o ISessionFactory e para isso temos que recuperar as configurações do arquivo de configuração do NHibernate através do método Configure() da classe Configuration.
Em seguida registramos os arquivos de mapeamento através do método AddAssembly que usa o nome do Assembly onde estão os arquivos de mapeamento do NHibernate.
O método OpenSession() cria o SessionFactory e retorna um objeto ISession que representa a sessão NHibernate.
Agora vamos criar uma interface no projeto onde iremos definir os métodos que iremos usar na aplicação;
No menu Project -> Add Class , informe o nome IUsuarioRepositorio.vb e clique em Add;
A seguir defina o seguinte código nesta interface:
Imports System.Collections.Generic
Sub Update(ByVal product As Usuario) Sub Remove(ByVal product As Usuario) Function GetById(ByVal id As Guid) As Usuario Function GetByLogin(ByVal login As String) As Usuario Function getAllUsuarios() Function GetByPerfil(ByVal perfil As String) As ICollection(Of Usuario)
|
Apenas para lembrar em uma interface definimos apenas as assinaturas dos métodos que deverão ser implementados por quem for implementar a interface.
Para implementar a interface vamos criar uma classe concreta: No menu Project -> Add Class , informe o nome UsuarioRepositorio.vb e clique em Add;
A seguir vamos definir o código que vai implementar cada um dos métodos definidos na interface:
Imports NHibernate Imports NHibernateASPNET Imports NHibernate.Criterion Public Class UsuarioRepositorio Implements IUsuarioRepositorio Using session As ISession = NHibernateHelper.OpenSession() Using transaction As ITransaction = session.BeginTransaction() session.Save(usuario) transaction.Commit() End Using End Using End Sub
Public Function GetById(ByVal id As System.Guid) As Usuario Implements IUsuarioRepositorio.GetById Using session As ISession = NHibernateHelper.OpenSession() Return session.[Get](Of Usuario)(id) End Using End Function
Public Function GetByLogin(ByVal login As String) As Usuario Implements IUsuarioRepositorio.GetByLogin Using session As ISession = NHibernateHelper.OpenSession() Dim product As Usuario = session.CreateCriteria(GetType(Usuario)).Add(Restrictions.Eq("Login", login)).UniqueResult(Of Usuario)() Return product End Using
Public Sub Remove(ByVal usuario As Usuario) Implements IUsuarioRepositorio.Remove Using transaction As ITransaction = session.BeginTransaction() session.Delete(Usuario) transaction.Commit() End Using End Using End Sub
Public Sub Update(ByVal usuario As Usuario) Implements IUsuarioRepositorio.Update Using session As ISession = NHibernateHelper.OpenSession() Using transaction As ITransaction = session.BeginTransaction() session.Update(Usuario) transaction.Commit() End Using End Using End Sub Public Function getAllUsuarios() As Object Implements IUsuarioRepositorio.getAllUsuarios Using session As ISession = NHibernateHelper.OpenSession() Dim usuarios As IList = session.CreateCriteria(GetType(Usuario)).List() Return usuarios End Using End Function Using session As ISession = NHibernateHelper.OpenSession() Dim usuarios = session.CreateCriteria(GetType(Usuario)).Add(Restrictions.Eq("Perfil", perfil)).List(Of Usuario)() Return usuarios End Using
End Class
|
Destaques :
Neste momento a nossa solução deverá ter a seguinte estrutura:
Eu optei criar as classes e os arquivos de
configuração em um mesmo projeto e no mesmo local.
Fiz isso porque o projeto é bem simples e para tornar mais fácil a visualização da estrutura. Para projetos maiores é aconselhável criar pastas distintas para as classes e para os arquivos de configuração no mesmo projeto. Pode-se ainda criar projetos distintos para dividir a solução em camadas o que esta mais aderente as boas práticas. |
Agora só falta definirmos a interface da aplicação que será a página ASP .NET Default.aspx e usar os recursos que criamos até aqui no projeto.
Aguarde a continuação deste artigo em : ASP .NET - Usando o NHibernate em uma aplicação Web III
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências: