Visual Basic - Ing.

Life is soft - evento anual de software empresarial
 
Vista:

Ing.

Publicado por Alfredo Chavez (2 intervenciones) el 11/03/2004 06:10:10
Hola, mi problema es el siguiente:

Estoy trabajando en un proyecto para una afore, en el cual tengo que
intercambiar datos con un sistema Unix. Originalmente la interfaz era
atravez de una DLL que hacia llamados a un emulador de telnet que pasaba y
recibia los datos desde mi programa como si hubieran sido tecleados. Mas
adelante, este sistema resultó ser demaciado lento y poco escalable por lo
que ahora que la afore está revisando varios de sus procesos decidieron
cambiar la interfaz de tal suerte que ahora recibo y mando datos hacia una
base de datos SQL server y las actualizaciones se hacen en batch durante las
noches y fines de semana. El problema es que en algunos casos aún es
necesario usar la interfaz anterior por lo que deben ser switcheables en
runtime.

Asi, el sistema cuenta con las siguientes clases:

i_IntSAFRE (Private)
|
+-- c_IntTransoft (Private)
|
+-- c_IntSqlSrv (Private)

* i_IntSAFRE es una clase abstracta que uso para definir la interfaz de mis
clases.

* c_IntTransoft y c_IntSqlSrv son ambas clases concretas que implementan a
i_IntSAFRE. Ya que el código cliente no utiliza ninguna de estas clases
directamente, todas estan declaradas como Private.

El cliente tiene acceso a las clases concretas mediante dos clases:

CExpediente (PublicNotCreatable) ---usa---> CAplicacion (GlobalMultiuse)

CAplicacion tiene la función de FactoryObject en el sistema y es la
responsable de suministrar objetos tanto al cliente como a los objetos
privados del sistema. El cliente no puede crear i_IntSAFREs directamente ya
que el FactoryMethod esta declarado como Friend.

CExpediente es el encargado de manejar (como su nombre lo indica) las
operaciones concernientes a expedientes de afiliados a la afore. Esta clase
utiliza a CAplicacion para crear los objetos de interfaz SAFRE que necesita
para realizar su trabajo (En cierto sentido se puede pensar en esto como un
patrón Strategy o Bridge)

Ahora bien, todo esto funciona fenomenalmente. Este diseño nos ha resuelto
la vida en muchos aspectos, ya que se tienen muchas más variaciones sobre el
mismo tema en puerta. Solo tiene un problema: ¡¡¡Solamente funciona en mi
máquina de desarrollo!!!

Cuando se instala la aplicación en una máquina de producción, funciona
perfectamente con la implementación original (c_IntTransoft) (de la cual se
derivó posteriormente la interfaz y se generalizó para obtener el diseño
explicado anteriormente. Pero cuando se utiliza c_IntSqlSrv, la llamada al
método fábrica falla con el mensaje "Object does not support automation" y
por ningún motivo puedo hacerlo funcionar.

Mi método fábrica es el siguiente:

'CAplicacion
Friend Function CreaIntSafre() As i_IntSAFRE
Select Case mve_IntSafre
Case isTransoft
Set CreaIntSafre = New c_IntTransoft
Case isSqlServer
Set CreaIntSafre = New c_IntSqlSrv
Case Else
Err.Raise vbObject, mct_CLASS_NAME, "Funcionalidad no implementada"
End Select
End Function

y el código que lo llama es:

'CExpediente
...
BuscaEnSAFRE = False

Dim lvo_aRegs() As c_InfoExp
Dim lvo_Safre As i_IntSAFRE

Set lvo_Safre = go_Aplicacion.CreaIntSafre()

Select Case lvo_Safre.BuscaExp(Me, lvo_aRegs)
Case 1
BuscaEnSAFRE = True
Case Is > 1
BuscaEnSAFRE = ExpSelecciona(lvo_Safre, lvo_aRegs)
...

La documentación y articulos que he encontrado acerca de las propiedades
"Private" y "PublicNonCreatable" no son muy detalladas y solo dicen que con
esto se limita el ámbito en el cual es posible hacer referencia/crear
objetos.

¿Alguien tiene una idea de que pasa?

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder