Comecei a estudar o NHibernate e logo me veio a cabeça a idéia de fazer
um DAO Genérico, ou seja, uma única classe de acesso a dados que
consiga persistir qualquer objeto. Já que VB.Net (e também C#) têm
suporte a generics, isso é possível. Segue a interface do DAO:
1: Imports NHibernate
2: Imports System.Collections.Generic
3:
4: ''' <summary>
5: ''' Classe genérica para acesso a dados utilizando NHibernate. Como utiliza generics, é possível persistir
6: ''' qualquer objeto, bastando definir os tipos a serem usados no lugar de T e ID.
7: ''' <example>
8: ''' Dim usuario As New Usuario
9: ''' Dim usuarioDAO As New GenericDAO(Of Usuario, Integer)
10: '''
11: ''' usuario.Nome = "Rogério"
12: ''' usuario.Telefone = "19 32612649"
13: ''' usuario.Email = "bragil@gmail.com"
14: '''
15: ''' If usuarioDAO.Insert(usuario) Then
16: ''' Console.WriteLine("Sucesso!")
17: ''' Else
18: ''' Console.WriteLine("Erro ao inserir registro!")
19: ''' End If
20: ''' </example>
21: ''' </summary>
22: ''' <typeparam name="T">Tipo do objeto persistível</typeparam>
23: ''' <typeparam name="ID">Tipo de dado do identificador único (chave primária)</typeparam>
24: Public Class GenericDAO(Of T, ID)
25: Implements IGenericDAO(Of T, ID), IDisposable
26:
27: Private session As ISession
28: Private transaction As ITransaction
29:
30: ''' <summary>
31: ''' Construtor, obtém a sessão do NHibernateHelper e inicia a transação.
32: ''' </summary>
33: Public Sub New()
34: Try
35: session = NHibernateHelper.GetSession(GetType(T).Assembly)
36: transaction = session.BeginTransaction()
37: Catch ex As Exception
38: If Not session Is Nothing Then
39: transaction.Dispose()
40: session.Close()
41: End If
42: End Try
43: End Sub
44:
45: ''' <summary>
46: ''' Persiste um novo objeto.
47: ''' </summary>
48: ''' <param name="Obj">Objeto a ser persistido</param>
49: ''' <returns>True para sucesso, False para erro.</returns>
50: Public Function Insert(ByVal Obj As T) As Boolean Implements IGenericDAO(Of T, ID).Insert
51: Try
52: session.Save(Obj)
53: Catch ex As Exception
54: session.Close()
55: Return False
56: End Try
57: Return True
58: End Function
59:
60: ''' <summary>
61: ''' Atualiza um objeto existente.
62: ''' </summary>
63: ''' <param name="Obj">Objeto a ser atualizado</param>
64: ''' <returns>True para sucesso, False para erro.</returns>
65: Public Function Update(ByVal Obj As T) As Boolean Implements IGenericDAO(Of T, ID).Update
66: Try
67: session.Update(Obj)
68: Catch ex As Exception
69: session.Close()
70: Return False
71: End Try
72: Return True
73: End Function
74:
75: ''' <summary>
76: ''' Exclui um objeto existente.
77: ''' </summary>
78: ''' <param name="Obj">Objeto a ser atualizado</param>
79: ''' <returns>True para sucesso, False para erro.</returns>
80: Public Function Delete(ByVal Obj As T) As Boolean Implements IGenericDAO(Of T, ID).Delete
81: Try
82: session.Delete(Obj)
83: Catch ex As Exception
84: session.Close()
85: Return False
86: End Try
87: Return True
88: End Function
89:
90: ''' <summary>
91: ''' Recupera um objeto persistido na base de dados.
92: ''' </summary>
93: ''' <param name="Identifier">Chave primária do objeto</param>
94: ''' <returns>Objeto</returns>
95: Public Function Find(ByVal Identifier As ID) As T Implements IGenericDAO(Of T, ID).Find
96: Dim Obj As T = Nothing
97: Try
98: Obj = CType(session.Load(Obj.GetType, Identifier), T)
99: Catch ex As Exception
100: session.Close()
101: End Try
102: Return Obj
103: End Function
104:
105: ''' <summary>
106: ''' Retorna todos os objetos persistidos na base de dados.
107: ''' </summary>
108: ''' <returns>Coleção de objetos</returns>
109: Public Function FindAll() As List(Of T) Implements IGenericDAO(Of T, ID).FindAll
110: Dim list As New List(Of T)
111: Try
112: list = session.CreateCriteria(GetType(T)).List(Of T)()
113: Catch ex As Exception
114: session.Close()
115: End Try
116: Return list
117: End Function
118:
119: ''' <summary>
120: ''' Confirma a transação corrente (commit)
121: ''' </summary>
122: Public Sub Commit()
123: transaction.Commit()
124: End Sub
125:
126: ''' <summary>
127: ''' Desfaz a transação corrente (rollback)
128: ''' </summary>
129: Public Sub Rollback()
130: transaction.Rollback()
131: End Sub
132:
133: Private disposedValue As Boolean = False ' To detect redundant calls
134:
135: ' IDisposable
136: Protected Overridable Sub Dispose(ByVal disposing As Boolean)
137: If Not Me.disposedValue Then
138: If disposing Then
139: transaction.Dispose()
140: session.Close()
141: session.Dispose()
142: End If
143: ' TODO: free shared unmanaged resources
144: End If
145: Me.disposedValue = True
146: End Sub
147:
148: #Region " IDisposable Support "
149: ' This code added by Visual Basic to correctly implement the disposable pattern.
150: Public Sub Dispose() Implements IDisposable.Dispose
151: ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
152: Dispose(True)
153: GC.SuppressFinalize(Me)
154: End Sub
155: #End Region
156:
157: End Class
E agora, para poder funcionar, o NHibernateHelper (bem simplificado, para fins didáticos). Lembrando que em ambiente web é necessário adaptar este helper, de modo a garantir o fechamento da sessão ao final de cada requisição.