Estas últimas semanas tenho parado para pensar numa forma simples de persistir os dados de uma (ou várias) tabelas num único formulário.
Este é o funcionamento típico de uma aplicação Web, onde os dados da base de dados estão estritamente ligados à forma como são pedidos ao utilizador.
Como ultimamente tenho usado e abusado da metodologia MVP (Model View Presenter, uma evolução do MVC – Model View Controler) claro que esta foi a primeira abordagem usada. Felizmente penso ter encontrado a solução que procuro.
Antes demais quero definir alguns pressupostos:
- Utilização de 3 camadas; Apresentação, Negócio e Acesso a dados, e um objecto comum a todos as camadas, Modelo onde está representadas as tabelas / views das base de dados.
- Entre as diversas camadas comunicam sempre usando os objectos contidos no objectos de Modelo (ou Listas de objectos) e nunca objectos IDataReader, DataTable ou DataSet.
Desta forma, temos um exemplo de uma tabela com os campos ID (int) e Nome (string). No objecto Model temos uma interface (ITableModel) que define o esqueleto desta tabela e uma class que implementa este interface. Assim temos um objecto que irá persistir os dados de cada registo da tabela.
Na minha camada de apresentação (usando o MVP) iremos ter uma interface que irá definir os campos que o utilizador manipula e se temos um formulário que manipula a tabela anteriormente definida, temos uma interface IDefault que implementa a interface ITableModel. Desta forma temos todos os campos da tabela definido no WebForm.
Derivo o meu formulário Default.aspx.cs do IDefault e atribuo os campos TextBox às variáveis definidas pela camada de apresentação.
Quando o utilizador pressionar no botão de Gravar, o WebForm passa para a apresentação os dados das TextBox e partir deste ponto posso fazer o cast:
ITableModel = (ITableModel) IDefault
Assim, tenho os dados a serem gravados na base de dados pela camada de acesso a dados num objecto, sem ter feito atribuições entre os campos e um objecto, etc.
Agora tenho que passar o objecto do tipo ITableModel para a camada de negócios e posteriormente para a camada de acesso a dados para criar as linhas de comando SQL.
Neste ponto podemos fazer de duas formas:
- Criamos as linhas de comando SQL hard coded
- Criamos as linhas de comando SQL usando Refletion
Se houver interessados poderei explicar como gero as linhas de comando SQL usando Refletion, o que me poupa imenso trabalho a fazer debug de SQL.
Aqui tem o projecto em VS2005 para poderem olhar.
Para terminar, o exemplo que coloco tem ainda a possibilidade de um WebForm persitir os dados de várias tabelas.
Abraços
Paulo Aboim Pinto
?>