
Usualmente cuando utilizamos componentes y los publicamos con Remoting, se dificulta mantener una configuracion coherente de las partes del sistema. He visto lugares donde se utiliza un archivo Remoting.Config para guardar la configuracion de los componentes, y luego dentro de otro archivo .config, se guarda casi el mismo dato para poder usarlo desde la aplicacion.
Una de las tecnicas aconsejdas por Microsoft y que por lo general da muy buen resultado, es guardar la configuracion en un archivo .Config (Remoting.Config por ejemplo) y al momento de inicializar la aplicacion cargar dinamicamente esta configuracion. En el caso de una aplicacion Windows, a esto lo podemos hacer en el evento Load del Form de la siguiente manera
Private Sub frmPrincipal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
‘ carga la configuracion de los componentes de Remoting
Dim remFile As String = "Remoting.config"
System.Runtime.Remoting.RemotingConfiguration.Configure(remFile)
End Sub
El archivo Remoting.Config podria contener la siguiente informacion
<
configuration> <system.runtime.remoting> <application> <channels> <channel ref="http" useDefaultCredentials=’true’> <clientProviders> <formatter ref="binary"></formatter> </clientProviders> </channel> </channels> <client> <wellknown type="ICliente, ICliente" url="http://localhost/ServidorComponentes/Cliente.soap"></wellknown> </client> </application> </system.runtime.remoting></
configuration>Cuando se desea crear una nueva instancia de un componente, por lo general necesitamos conocer el tipo de objeto que queremos probar y la url donde se publica el mismo. Usualmente se utiliza el objeto Activator y las lineas para inicializar un componente de Remoting son:
Dim urlRem As String
Dim iC As ICliente
urlRem = "http://localhost/ServidorComponentes/Cliente.soap"
iC = Activator.GetObject(
GetType(ICliente), urlRem)
Sin embargo, si ya tenemos cargada la informacion desde el archivo .config, se puede acelerar el proceso de creacion de componentes, leyendo la informacion desde el registro local de componentes de Remoting. Para esto podemos utilizar el metodo RemotingConfiguration.GetRegisteredWellKnownClientTypes
RemotingConfiguration.GetRegisteredWellKnownClientTypes (Método)
Recupera una matriz de tipos de objetos registrados en el cliente como tipos conocidos.
Recupera una matriz de tipos de objetos registrados en el cliente como tipos conocidos.
[Visual Basic]
Public Shared Function GetRegisteredWellKnownClientTypes() As WellKnownClientTypeEntry()
Public Shared Function GetRegisteredWellKnownClientTypes() As WellKnownClientTypeEntry()
Valor devuelto
Matriz de tipos de objetos registrados en el cliente como tipos conocidos.
Matriz de tipos de objetos registrados en el cliente como tipos conocidos.
Comentarios
Los tipos de objetos conocidos pueden ser llamadas únicas o singleton. Si un tipo de objeto es una llamada única, se crea una nueva instancia de él cada vez que se recibe una llamada del cliente. Todas las llamadas a un objeto singleton se controlan mediante una instancia de ese objeto.
Los tipos de objetos conocidos pueden ser llamadas únicas o singleton. Si un tipo de objeto es una llamada única, se crea una nueva instancia de él cada vez que se recibe una llamada del cliente. Todas las llamadas a un objeto singleton se controlan mediante una instancia de ese objeto.
Utilizando este metodo, podemos crear un helper, que cargue internamente una lista de los objetos que estan configurados y luego, permita de una manera las simple, crear los objetos Remoting. Para esto creamos una clase Helper.
Imports
System.RuntimeImports
System.Runtime.RemotingPublic Class RemotingHelper ”’ —————————————————————————– ”’ <summary> ”’ Define si se ha inicializado el diccionario shared que almacena los tipos ”’ que se pueden acceder desde remoting ”’ </summary> ”’ <remarks> ”’ </remarks> ”’ <history> ”’ [BCA] 27/06/2005 Created ”’ </history> ”’ —————————————————————————– Public Shared mLoaded As Boolean ”’ —————————————————————————– ”’ <summary> ”’ Almacena los tipos que se pueden acceder desde Remoting ”’ </summary> ”’ <remarks> ”’ </remarks> ”’ <history> ”’ [BCA] 27/06/2005 Created ”’ </history> ”’ —————————————————————————– Public Shared mWellKnownTypes As IDictionary ”’ —————————————————————————– ”’ <summary> ”’ Retorna un objecto, a partir del tipo del mismo. Se crea en base a la ”’ definicion de los objetos que se pueden crear remotos ”’ </summary> ”’ <param name="type">Tipo del Objeto a crear</param> ”’ <returns>New Object</returns> ”’ <remarks> ”’ </remarks> ”’ <history> ”’ [BCA] 27/06/2005 Created ”’ </history> ”’ —————————————————————————– Public Shared Function GetObject(ByVal type As Type) As Object Dim strExc As String ‘ inicializa el cache de objetos If Not mLoaded Then
LoadRemTypes()
End If ‘ obtiene el tip Dim entr As WellKnownClientTypeEntry = mwellKnownTypes(type) If entr Is Nothing ThenstrExc = "Type [{0}] not found!"
strExc =
String.Format(strExc, type.ToString) Throw New RemotingException(strExc) End If ‘ crea el objeto Return Activator.GetObject(entr.ObjectType, entr.ObjectUrl) End Function ”’ —————————————————————————– ”’ <summary> ”’ Inicializa el diccionario interno de Objetos que se pueden crear por remoting ”’ </summary> ”’ <remarks> ”’ </remarks> ”’ <history> ”’ [BCA] 27/06/2005 Created ”’ </history> ”’ —————————————————————————– Public Shared Sub LoadRemTypes() Dim sExcepcion As String = "" Dim sAssName As StringmLoaded =
TruemwellKnownTypes =
New Hashtable ‘ recorre los tipos que se pueden crear For Each entr As WellKnownClientTypeEntry In RemotingConfiguration.GetRegisteredWellKnownClientTypes() If (entr.ObjectType Is Nothing) Then TrysAssName = entr.AssemblyName
CatchsAssName = "No Assembly Name defined."
End TrysExcepcion = "A configured type could not be found. Please check spelling. AssemblyName: [{0}]"
sExcepcion =
String.Format(sExcepcion, sAssName) Throw New RemotingException(sExcepcion) End If ‘ agrega el nuevo tipomwellKnownTypes.Add(entr.ObjectType, entr)
Next End Sub End Class( Les debo la indentacion
) Finalmente la creacion de un objeto a partir de un servidor de componentes Remoting, queda mucho mas simple
Dim iC As ICliente
iC = RemotingHelper.GetObject(GetType(ICliente))
Pues bien, este es un pequeño ejemplo de algo que tambien nos ayuda a programar de una forma mas simple.
Saludos y si quieren que se incluya en .Net 2.0, lo pueden votar en http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=d85ff541-59d9-4b9e-a6af-76eab9489f8e
Tb esta publicado en el Guille http://tinyurl.com/dj82z
Leave a comment