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.