C#, Visual Basic by Codelines

      Veja aqui: C-Sharp, Visual Basic 6.0 , ASP.Net, VB .NET, WPF, cursos de programação, banco de dados Access e SQL Server, downloads, dicas, tutoriais, serviços de desenvolvimento de sistemas, APIs, activex, código fonte, exemplos, type libraries . 

 

Plataforma CSLA para objetos de negócio

Neste artigo, vamos falar sobre objetos de negócio e de um recurso gratuito que temos na Internet para automatizar e estruturar algumas ações comuns a todos os objetos de negócio. Trata-se da plataforma CSLA desenvolvida por Rockford Lotka, um renomado especialista em programação orientada a objetos.

Objetos de negócio são as classes onde são verificadas as regras de validação das propriedades dos objetos que fazem parte da aplicação e de seus relacionamentos. Normalmente, cada objeto de negócio é representado no banco de dados por uma ou mais tabelas. Os objetos de negócio possuem propriedades que correspondem aos campos da tabela que os representa no banco de dados e são ligados aos formulários da aplicação por databinding de modo que o valor de cada uma das suas propriedades seja ligado a um campo do formulário. Objetos de negócio podem ser do tipo raiz, que não são filhos de outro, ou podem ser objetos filhos que dependem para existir da existência prévia do seu objeto pai. Um objeto filho também pode ser pai de outro e assim por diante. Quando um objeto é filho de outro, costuma haver no objeto pai uma propriedade para referenciá-lo. Se o relacionamento entre a classe do objeto pai e a classe do objeto filho for de um-para-um, a classe do pai terá uma propriedade do tipo da classe do objeto filho. Caso o relacionamento seja de um-para-muitos, a propriedade será do tipo coleção.

Seja qual for o relacionamento pai-filho, quando o objeto pai é carregado para edição, os objetos filhos também são carregados já que eles fazem parte das informações que definem o objeto pai. Se um objeto filho dentro da hierarquia de objetos é alterado, ele pode ter sua validação para salvamento dependente de propriedades do objeto pai e mesmo de outros objetos da hierarquia. Desta forma, ele deve ser salvo apenas quando o objeto de mais alto nível for salvo e as regras de validação neste nível estiverem verificadas. Se as modificações não forem válidas para salvamento do objeto pai, o usuário deve poder cancelar todas as alterações na hierarquia de objetos e fazer com que tudo volte ao que era antes de iniciar a edição. Ou seja, é preciso que uma cópia seja feita do valor de cada propriedade de cada objeto da hierarquia no momento em que se dá início à edição do objeto pai. Assim será possível desfazer em cada objeto qualquer alteração nele. Mas implementar isto dá trabalho e padronizar um modo de fazer isto também. Mas esta é uma das coisas que a plataforma CSLA nos dá de graça.

Derivando nossos objetos da classe BusinessBase da plataforma CSLA, eles terão a capacidade de armazenar seus dados em um cache interno sempre que se chamar o método BeginEdit desta classe base. Quando houver necessidade de cancelar uma edição, bastará chamar o método CancelEdit e todas as propriedades do objeto e de seus objetos filhos em qualquer nível da hierarquia serão restauradas ao que eram antes do início da edição.

Outra coisa que a plataforma CSLA nos dá é um sistema formidável para criar regras de validação de modo que as próprias regras são objetos com métodos associados a elas que fazem a validação do objeto. As regras são associadas às propriedades dos objetos e, toda vez que uma propriedade muda, as regras associadas a ela são executadas. Cada regra tem uma propriedade onde é armazenada a mensagem de erro para ser exibida na interface gráfica quando o método que verifica a regra retornar false. Quando a execução de uma regra retorna false, ela é adicionada à coleção BrokenRulesCollection da classe BusinessBase e a propriedade Error desta classe retorna a lista das mensagens de erro das regras na BrokenRulesCollection. À medida que as regras vão sendo testadas e retornam true, elas vão sendo retiradas da BrokenRulesCollection se lá estiverem. Uma regra pode ser executada sempre que outras propriedades mudem mediante a criação de uma dependência entre as propriedades. Regras podem ter prioridade de execução e suspender a execução de outras de menor prioridade quando retornam false. O objeto é considerado válido para salvamento somente quando quando a sua BrokenRulesCollection estiver vazia e o mesmo ocorrer com a BrokenRulesCollection de cada um dos seus objetos filhos dentro da hierarquia que ele representa.

A classe BusinessBase também monitora o estado dos objetos pelas propriedades IsDirty, IsNew e IsDeleted que indicam quando um objeto foi alterado, é novo ou está marcado para ser excluído. Desta forma, a plataforma chama automaticamente os métodos adequados para incluir, atualizar ou excluir o objeto no momento da persistência dos dados. No caso de objetos não-novos, somente aqueles com IsDirty em true serão salvos dentro de uma hierarquia. Se as configurações indicarem que a camada de acesso a dados reside em outro computador, a plataforma serializará os objetos automaticamente para que eles viajem na rede de modo transparente para o programador.

Para usar a plataforma CSLA você precisará aderir a alguns padrões implementando alguns métodos que são chamados por padrão pelo método Save da classe BusinessBase. Se o objeto for um objeto raiz, por exemplo, a classe BusinessBase irá chamar o método DataPortal_Insert sempre que a propriedade IsNew do objeto estiver em true; caso o objeto esteja com a propriedade IsDirty com true e IsNew seja false, a plataforma irá chamar o método DataPortal_Update; se o objeto estiver com IsDeleted com true e IsNew em false, o método chamado será DataPortal_Delete. As propriedades podem ser declaradas normalmente, mas para tirar proveito real da plataforma, você terá que declarar as propriedades de modo que elas sejam monitoradas pela plataforma. Isto é feito declarando uma variável do tipo PropertyInfo e os métodos GetValue e SetValue de BusinessBase passando o PropertyInfo da propriedade como argumento.

A plataforma oferece uma grande quantidade de classes de suporte aos mais diferentes tipos de projetos e de relacionamentos entre os objetos. Mais informações sobre a plataforma CSLA e o download das diversas versões podem ser obtidos em http://cslanet.com .

Na Codelines, temos usado a plataforma CSLA a pouco tempo, mas já nos convencemos da sua grande utilidade. Uma ferramenta para automatizar a geração de código foi desenvolvida para criar os objetos de negócio e implementar os métodos de busca, inclusão, alteração e exclusão dos objetos bem como as viewmodels usadas para relacioná-los com suas views. Para aplicações com WPF, a ferramenta gera os valueconverters para converterem ids de objetos em seus nomes para serem exibidos em janelas e gera inclusive parte da interface gráfica com as funções de localização, filtragem e exportação para Excel nas listas de objetos. Esta ferramenta com seu código fonte é vendida por apenas R$ 150,00. Caso tenha interesse nela, favor contatar-nos pelo e-mail codelines@codelines.com .

Pílulas de programação, pequenas dicas para o dia-a-dia.

Dica do dia: WPF: alterando propriedades no container por triggers no content

Conheça RealCash 2.0 - controle financeiro grátis  
Saia do vermelho controlando suas finanças com RealCash.

SilentIdea 4.0    
Enquanto trabalha você pode usar o micro para treinar sua mente e aumentar seu desempenho. Clique aqui para conhecer SilentIdea, uma ferramenta que irá ajudá-lo a melhorar sua performance no trabalho e nos estudos.

Saiu o Service Pack 6 Para o VB6

Curso de programação em Visual Basic 6.0 Grátis Aqui

Servidor de SQL Server Grátis: MSDE

Tabela de strings de conexão OLE DB a vários bancos de dados e em diferentes situações.

Recordsets ADO Num Mundo n-Camadas. Veja aqui.

Seu banco de dados Access vive se corrompendo? Tente isto .

Atualizações de Recordsets Client-Side no VB.

Históricos de Objetos Compostos : como manter históricos de objetos relacionados numa composição e de seus relacionamentos.

Viva sem bloquear registros  (atualizado) Usando um conceito simples é possível lidar com o problema de concorrência de múltiplos usuários pelas mesmas informações sem ter que privar ninguém de acessá-las em momento algum.

Quer depurar seu código mais rápido? Veja aqui como.

Instalador Gratuito: Inno Setup Veja aqui como conseguir um instalador profissional e gratuitamente.

Novo  artigo sobre Serialização . Transportar objetos em rede cria uma sobrecarga no sistema  gerenciador da distribuição de objetos, o que pode inviabilizar o funcionamento da aplicação; gravar um objeto complexo na forma de documento em arquivo ou banco de dados pode ser trabalhoso quando se tem uma hierarquia de objetos contidos uns em outros. Neste artigo mostramos como o uso do objeto PropertyBag pode facilitar a sua vida na hora de lidar com os problemas acima. Clique aqui para ler o artigo.

Tutorial sobre programação em Active Server Pages : neste tutorial você pode se iniciar nesta tecnologia muito requisitada atualmente dos programadores de Visual Basic. Veja aqui.

Tutorial sobre subclassificação de janelas , uma técnica avançada para dar mais poder às suas aplicações. Veja aqui.

Tabela de conversão de tipos de dados DAO/ADO e SQL Server/ADO


Pílulas de programação (pequenas dicas para o dia-a-dia)

WPF: alterando propriedades no container por triggers no content

MVVM: eliminando a necessidade de callbacks para exibir views modais

WPF: behavior para aplicar efeito grayscale a controles desabilitados

IdentityMap: uma instância, múltiplas referências

Classe WPFHourGlass para melhor controle do cursor de ampulheta no WPF

API Viewer para .NET

Criando classes com propriedades dinâmicas

Um bom uso para CallByName

Carregando objetos na hora certa

Cuidado com os nomes dados aos parâmetros de consultas

Descobrindo quando um e-mail foi aberto com ASP

Descobrindo a versão do Internet Explorer

Lidando com aspas simples em strings para SQL

Consultas SQL Para Gerar Extratos

Atualizando todos os itens de um ramo de hierarquia finita  

Criando Propriedades de Formulários Com as APIs SetProp, GetProp e RemoveProp

Salvando e Carregando Configurações de Formulários

Mais um truque com SQL

Forms MDI Filhos e Janelas Modais

Quando o DataGrid não povoa

SQL Server: obtendo o identificador errado com @@Identity

SQL: Excluindo registros duplicados em uma tabela

Cuidado com On Error Resume Next em Loops

Trabalhando com Subqueries

Cuidado com a propriedade Backcolor de alguns controles do Visual Basic

Problemas com o Crystal Reports 8.5

Passagem de objetos usando ByVal

Use VbCRLF para quebrar longas strings de SQL

Como Encontrar Constantes Não-Documentadas Usadas pelas Funções da API do Windows

TextWidth no XP retorna o mesmo valor para Normal e Italic

Criando uma fila de eventos para o seu programa

Fazendo um TextBox aceitar apenas números

Mantendo um número serial único

Indentando código em ASP

Como imprimir linha por linha numa impressora

Como criar uma lista dos arquivos mais recentemente utilizados (MRU) no Visual Basic

Formulários: preenchendo o plano de fundo com uma imagem

Obtendo a hora de um servidor NT

OOP no VB: formulário de dados controlado por objeto

VB: Algumas macros de teclado úteis

Access com operadores binários no Jet4: BAND, BOR, BXOR E BNOT

Dica de Design no VB: como por todos os seus objetos em comunicação.

OOP no VB: lidando com referências circulares

Dica de Design: criando propriedades com UnderlyingValues e OriginalValues

Usando uma constante para MsgBox não listada

Formulários: ajustando a largura da área drop down de uma combo box

XML: Criando um Recordset Desconectado de uma String XML

VB: SendKeys usando API

API: formatando drives com a função não- documentada SHFormatDrive

Visual Basic: lidando com erros no evento Load dos formulários

ADO: desconectando um Recordset gerado por um objeto Command

ASP: Use Response.IsClientConnected após longas consultas

OOP no Visual Basic: sinalizando alterações em composições de objetos

Cuidado ao usar a função Format para formatar datas

ADO: obtendo o valor do campo auto-numeração após INSERT no JET4

Banco de Dados: grave histórico de tudo

Dica de Design: usando recordset compartilhado entre objetos

Viva sem bloquear registros  (atualizado)

Dica de design: criando um servidor genérico

Dica de design: atualizando arquivos nas máquinas clientes

OOP no VB:classe para controlar transações no ADO

OOP no VB: classe para conectar-se a recurso em rede

Dica de design: acessando classes Public Not Creatable

OOP no VB: não declare variáveis usando As New

VB: alguns atalhos no editor de código

VB: algumas funções sempre úteis

Setup do VB: cuidado com o arquivo SHLWAPI.DLL

VB: determinando se uma string está em caixa alta

Formulários no VB: copiando menus rapidamente

Dica de Design: usando máquinas de estado para lidar com a complexidade no VB

VB: lidando com reentrância de eventos.

OOP no VB: cuidado que deve ser tomado ao usar ObjPtr

VB: lidando com erros de timeout em servidores OLE

Formulários no VB: mudando a relação de parentesco com API

Access: anexe tabelas usando apenas UNC paths

Solução para o problema do Tabbed Dialog Control que move o foco para os controles das tabs inativas quando se usa a tecla Tab

ASP: Use Declarações de TypeLib para ADO e Outros Componentes

VB: breakpoints que permanecem após fechar o Visual Basic

VB: não compare datas com o operador '='

VB: tendo sua própria MsgBox

OOP no VB: classe para bloquear e desbloquear janelas com segurança

VB: Lidando Com o Cursor de Ampulheta

Conecte um Recordset ADO customizado a um banco de dados usando XML

VB: sicronizando formulários

SQL: usando TRANSFORM para agrupar também em colunas  

Passando matrizes por valor no VB

Passando Strings Entre Aplicações no VB Usando a API SendMessage

DAO: Exportando Access para formatos ISAM

Usando a função ObjPtr não documentada no Visual Basic

Performance do ADO: crie objetos Field explicitamente quando fizer loop em grandes Recordsets

VB: concatenando strings mais rápido com o comando Mid$

SQL: Valores NULL na cláusula WHERE

ASP: Encapsule código em objetos COM

ActiveX: Interceptando eventos MouseEnter e MouseExit sem subclassificar

Exibindo a lista de uma Combobox do VB com API

ASP: não armazene conexões ao banco de dados nos objetos Application ou Session

String para conexão a um banco de dados Access protegido por senha

Populando uma Treeview no VB: o modo rápido

SQL: usando Having para agrupar com mais critério

Verificando se a aplicação está rodando compilada ou no ambiente do VB

Relacionando uma tabela com ela mesma para manter hierarquias no banco de dados

Sintaxe para criação de recordsets hierárquicos customizados

Compactando caminhos longos no VB com a biblioteca SHLWAPI

Exibindo gifs animados no VB 

Um modo melhor de levantar os itens selecionados numa listbox de múltipla seleção

Descobrindo se o usuário está conectado à Interntet com API

Obtendo valores de retorno de uma stored procedure com ADO

Dica de atalho para navegar mais rápido nas janelas de código do VB

Exibindo arquivos Flash no VB

Usando o tipo certo de constante

Lidando com os índices de uma matriz dinâmica


Se você gostou deste site e tem a barra do Google instalada, favor votar nele para projetá-lo melhor no resultado das buscas e para que outras pessoas possam vir a conhecê-lo.


E-mail: codelines@codelines.com

Contador de visitas
Sayaç
Contador de visitas


Conteúdo:

 

Software de avaliação de desempenho

Controle Financeiro

Subliminal messages software

Novo MSG

controle financeiro pessoal

controle financeiro grátis

CashPreview

estoque

download controle financeiro

expressões idiomáticas