codigo almacenado

15/11/2004 - 23:47 por Gerardo | Informe spam
Buenas desarrolladores: estoy con un problema necesito ejecutar codigo en
tiempo de ejecucion, pero este codigo lo tendria que almacenar en base de
datos.
El codigo me sirviria para dar unos retoques que son muy variables en mis
reglas de negocio.
Este codigo que quisiera guardaria serian funciones y Sub's

Desde ya mil gracias

Saludos

Gerardo

Preguntas similare

Leer las respuestas

#1 Pedro Luna Montalvo, MVP
16/11/2004 - 02:51 | Informe spam
Saludos Gerardo,

Si bien no especificas en que lenguaje estaria escrito el codigo almacenado,
asumo que te refieres a VB.NET.

El siguiente es un simple codigo de una aplicacion de consola que te muestra
una alternativa.


Imports System.CodeDom.Compiler
Imports System.Reflection

Module Module1

' Esta funcion deberia retornar el codigo desde la base de datos
Function ObtenerCodigoDesdeBaseDatos() As String
Return "Class ClaseDinamica" & ControlChars.CrLf & _
"Sub Saludar(Mensaje As String)" &
ControlChars.CrLf & _
"System.Console.WriteLine(Mensaje)" &
ControlChars.CrLf & _
"End Sub" & ControlChars.CrLf & _
"End Class"
End Function


Sub Main()
' Obtener un CodeCompiler que corresponde a VB.NET
Dim Compilador As ICodeCompiler
Compilador = (New VBCodeProvider).CreateCompiler()

' Preparar las opciones del compilador
Dim parametros As New CompilerParameters()
parametros.GenerateInMemory = True ' Compilar en memoria!!!

' Compilar el código fuente!!
Dim resultado As CompilerResults
resultado = Compilador.CompileAssemblyFromSource(parametros,
ObtenerCodigoDesdeBaseDatos())

' Cargar el ensamblado y obtener el tipo
Dim tipo As Type =
resultado.CompiledAssembly.GetType("ClaseDinamica")

' Crear la instancia
Dim instancia As Object = Activator.CreateInstance(tipo)

' Invocar el método que muestra mensaje en consola
Dim metodo As MethodInfo = tipo.GetMethod("Saludar")
metodo.Invoke(instancia, New Object() {"Logramos compilar codigo
dinamicamente!!"})
End Sub
End Module

Espero te sirva


Saludos
Pedro Luna, [MVP VB.NET]
Gye, Ecu
Respuesta Responder a este mensaje
#2 SqlRanger
16/11/2004 - 11:11 | Informe spam
Aunque es cierto que se puede generar, compilar y ejecutar código en tiempo
de ejecución, no siempre es lo más adecuado para hacer lo que se pretende.
Esta técnica es poco eficiente y generalmente es posible hacer lo que se
necesita usando técnicas de programación orientada a objetos como el
polimorfismo, por ejemplo usando interfaces o herencia.

Imaginemos por ejemplo que tenemos que ejecutar un código diferente
dependiendo de ciertas condiciones varibles. Para ello podríamos definir un
interfaz:

Public Inteface IMiInterfaz
Sub MiMetodo( MisParametros As Object )
End Interface

Crearíamos una clase que implemente el interfaz por cada código diferente:

Public Class UnaClase
Implements IMiInterfaz
Public Sub MiMetodo( MisParametros As Object ) Implements IMiInterfaz
' Aquí viene el código que implementa el método
End Sub
End Class

Public Class OtraClase
Implements IMiInterfaz
Public Sub MiMetodo( MisParametros As Object ) Implements IMiInterfaz
' Aquí viene el código que implementa el método
End Sub
End Class

Public Class OtraClaseMás
Implements IMiInterfaz
Public Sub MiMetodo( MisParametros As Object ) Implements IMiInterfaz
' Aquí viene el código que implementa el método
End Sub
End Class


En función de las condiciones que se dén, instanciaríamos uno y otro objeto
de la clase y al final invocamos el método definido en el interfaz:

(1)

Dim MiObjeto As IMiInterfaz

If <Condicion1> Then
MiObjeto = New UnaClase
ElseIf <Condicion2> Then
MiObjeto = New OtraClase
Else
MiObjeto = New OtraClaseMas
End If

MiObjeto.MiMetodo( LosParametros )


Podrías incluso rizar más el rizo y almacenar en la base de datos el tipo de
dato a usar en función de un parámetro. Por ejemplo podríamos tener en la
base de datos una tabla como esta:

Parametro Tipo
1 MiAplicacion.UnClase
2 MiAplicacion.OtraClase
3 MiAplicacion.OtraClaseMas

Supongamos que tenemos un método que nos devuelve el tipo en función del
parámetro:

Public Function ObtenerTipo( Parametro As Object ) As String
Dim Tipo As String
' Accede a la base de datos para obtener el tipo
Return Tipo
End Function

Podríamos construir fácilmente un método que nos devolviera un objeto de
ese tipo en función del parametro:

Public Function ObtenerObjeto( Parametro As Object ) As IMiInterfaz
Dim t As Type = Type.GetType( ObtenerTipo( Parametro ) )
Return Activator.CreateInstance( t )
End Function

Entonces el código (1) podría quedar así:

Dim Parametro As Object = <Aquí viene una expresión para asignar al
parametro>
ObtenerObjeto( Parametro ).MiMetodo

Cualquiera de estas técnicas es mucho más eficiente que generar, compilar y
ejecutar código en tiempo de ejecución.


Saludos:

Jesús López
MVP
Solid Quality Learning
www.SolidQualityLearning.com


"Gerardo" escribió en el mensaje
news:e%23%
Buenas desarrolladores: estoy con un problema necesito ejecutar codigo en
tiempo de ejecucion, pero este codigo lo tendria que almacenar en base de
datos.
El codigo me sirviria para dar unos retoques que son muy variables en mis
reglas de negocio.
Este codigo que quisiera guardaria serian funciones y Sub's

Desde ya mil gracias

Saludos

Gerardo


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida