Explorando un assembly de BTS
Al desarrollar procesos de integración implementamos elementos de BTS como orquestaciones, esquemas, puertos, mensajes, variables y correlaciones entre otros, en nuestro desarrollo y desde la perspectiva de BTS estos objetos son claros y sabemos como se representarlos. Pero en el momento de compilación de nuestras orquestaciones, estas se convierten en assemblies y nuestros elementos sufren una variación para que el framework de .Net los pueda reconocer y ejecutar nuestros procesos.
La idea es mostrar como se presentan los elementos mas comunes como esquemas, puertos, orquestaciones y mensajes en .Net. Para ello utilizaremos la siguiente orquestación (ver imagen, de click aqui).
Esquemas y propiedades de esquemas:
En principio, todos los esquemas son representados como clases publicas selladas que derivan de la clase SchemaBase. Dentro de los esquemas también se incluye el archivo de propiedades de esquemas.
public sealed class ArchivoEntrada : SchemaBase
{}
public sealed class Propiedades : SchemaBase
{}
Las propiedades definidas dentro del esquema de propiedades también se representan como clases publicas selladas que derivan de al clase MessageDataBaseProperty ó MessageContextBaseProperty de acuerdo a su especificacion.
public sealed class Anexo_Contexto : MessageContextPropertyBase
{}
public sealed class Anexo_Mensaje : MessageDataPropertyBase
{}
Por último, es necesario establecer que tipo la relación entre el esquema que utiliza la propiedad y la clase de la propiedad misma, para ello se marca la clase del esquema con un atributo de la siguiente forma.
[SchemaReference("BtzToNet.Schemas.Propiedades", typeof(Propiedades)), Property(typeof(Anexo_Mensaje), XPath="/*[local-name()='Datos' and namespace-uri()='https://BtzToNet.Schemas.ArchivoEntrada']/*[local-name()='IdProceso' and namespace-uri()='']", XsdType="string")]
public sealed class ArchivoEntrada : SchemaBase
{}
Mapas:
El mapa es otra clase publica sellada que deriva de la clase TransformBase, y en la cual se especifican los esquemas de entrada y salida por medio de atributos que marcan dicha clase.
[SchemaReference("BtzToNet.Schemas.ArchivoEntrada", typeof(ArchivoEntrada)),
SchemaReference("BtzToNet.Schemas.ArchivoEntrada", typeof(ArchivoEntrada))]
public sealed class TranformarUsuarioConNombre : TransformBase
{}
public sealed class TransformarUsuarioConApellidos : TransformBase
{}
Orquestación y sus elementos:
Tipos de puertos:
Los tipos de puertos son elementos que se representan como clases selladas internas al assembly que derivan su funcionalidad de la clase BTXPortBase
internal sealed class TipoPuerto_Entrada : BTXPortBase
{}
internal sealed class TipoPuerto_Salida : BTXPortBase
{}
Tipos de mensajes:
Los tipos de mensajes tienen una característica especial en su definición ya que cuando se referencia de acuerdo a un esquema se definen dos clases, la primera clase deriva de XSDPart que corresponde a la parte que utilizara el tipo de mensaje y la segunda clase corresponde al tipo de mensaje multipart definido derivada de la clase BTXMessage en la cual se definen el esquema al cual pertenece y el valor de esa multiparte.
public sealed class __BtzToNet_Schemas_ArchivoEntrada__ : XSDPart
{}
[MessageType(EXLangSAccess.eInternal, EXLangSMessageInfo.eNone, "", new Type[1] { typeof(ArchivoEntrada) } , new string[1] { "value" } , new Type[1] { typeof(__BtzToNet_Schemas_ArchivoEntrada__) } , 0, "https://BtzToNet.Schemas.ArchivoEntrada#Datos")]
internal sealed class MultipartType_Entrada : BTXMessage
{
public __BtzToNet_Schemas_ArchivoEntrada__ value;
}
Orquestación:
La orquestación se representa como una clase sellada interna al assembly derivada de la clase BTXService. Los puertos son representados como variables internas a la clase de la orquestación y se definen de acuerdo al tipo del puerto, así mismo los mensajes son definidos de acuerdo al tipo de mensaje que utilizan y adicionalmente se marcan con un atributo para conocer el nombre que estos utilizan dentro de la orquestación.
internal sealed class ProcesarDatosUsuario : BTXService
{
internal TipoPuerto_Entrada Puerto_Entrada;
internal TipoPuerto_Salida Puerto_Salida;
[UserVariable("MsgEntrada")]
internal MultipartType_Entrada __MsgEntrada;
[UserVariable("MsgSalida")]
internal MultipartType_Entrada __MsgSalida;
}
Esta representación corresponde la definición de la estructura de las clases, dentro de cada una de las clases esta toda la lógica del proceso con sus respectivas validaciones e implementaciones; todas las clases de las cuales se derivan se encuentran referenciadas en el framework de trabajo de BTS 2004.
Si no tuviéramos VS.Net para diseñar nuestras orquestaciones lo podríamos hacer por medio de clases, solo tendríamos que saber su estructura y modo de operar y luego generar el assembly con un compilador del framework de .net (vbc, csc, etc). Después seria simplemente registrarlo dentro de BTS y tendríamos nuestro propio proceso construido manualmente, claro que tardaríamos solo un poco mas :p.
Existen muchas mas características para representar dentro de elementos como trabajando con tuberías, definiendo transacciones, campos distinguidos, llamando otras orquestaciones, que iremos explorando poco a poco en otros artículos. Saber esta estructura es bueno por que nos ayuda entender como trabajan internamente nuestros procesos y como podríamos mejorar se desempeño y realizar mejores practicas.
Autor: Carlos Medina
Este mensaje se proporciona "como está" sin garantías de ninguna clase, y no otorga ningún derecho
Comments
- Anonymous
May 29, 2009
PingBack from http://paidsurveyshub.info/story.php?title=biztalklatam-s-blog-explorando-un-assembly-de-bts