Dica de design: acessando classes Public Not Creatable

Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

Dica de design: acessando classes Public Not Creatable

Há situações em que se deseja que apenas um objeto de determinada classe sirva para atender a requisições de várias aplicações. O motivo para se precisar disto costuma ser o compartilhamento de informações acumuladas pelo objeto por várias aplicações diferentes. O objeto pode estar sendo usado, por exemplo, para coordenar o trabalho de diferentes aplicações. Nestes casos, pode-se criar um ActiveX EXE e criar a classe para este objeto dentro do ActiveX. A classe deve ser instanciada uma única vez na primeira requisição de sua criação e armazenada numa variável global do ActiveX Exe. Assim sendo, os objetos da classe não podem ser criados por cada aplicação cliente quando bem quiser. Para isto a classe deve possuir o atributo Public Not Creatable na sua propriedade Instancing. Desta forma, somente o ActiveX poderá criar instâncias desta classe. Mas, como então dar acesso aos clientes a esta instância única que será criada no processo do ActiveX servidor?. A solução é criar uma classe Public Multiuse que sirva como conector entre o cliente e o ActiveX Exe para solicitar uma referência ao objeto único criado no ActiveX. Podemos chamar esta classe de Connector e dar-lhe um único método: GetServidor. Este método serviria para retornar uma referência à instância única do objeto servidor armazenada no ActiveX Exe. O cliente poderia instanciar livremente objetos do tipo Connector, chamar o seu método GetServidor, receber uma referência ao objeto servidor e destruir o Connector.

Algumas observações finais sobre as características do ActiveX servidor:

- O ActiveX servidor deverá ser iniciado somente uma vez e no modo Stand Alone, ou seja, manualmente e antes de qualquer requisição de objeto por parte de um cliente. Para isto, insira no início do Sub Main do ActiveX as seguintes linhas de código:

 If App.PrevInstance Then
     End
 End If

 If App.StartMode = vbSModeAutomation Then End

Não esqueça de escolher Sub Main como StartUp Object na janela de propriedades do projeto do ActiveX.

- Na janela de propriedades do projeto do ActiveX, em General, escolha Thread Pool como Thread Model e deixe em 1 onde se informa o número de Threads.

O que foi exposto acima é o que, na linguagem de patterns (padrões), se chama de padrão SingleTown, uma forma de garantir que apenas uma instância de um determinado objeto exista por vez no sistema. A técnica acima é uma forma de fazê-lo no VB.