Invocar una directiva desde otra directiva
Puede invocar una directiva (secundaria) desde otra directiva (principal) mediante el uso de uno de los siguientes métodos:
Llamar al método Policy.Execute directamente desde la directiva primaria
Llamar a un método de un componente auxiliar de .NET que encapsula el método Policy.Execute de la directiva primaria
La ventaja de usar el segundo método es que puede agregar código de procesamiento previo y posterior al procesamiento al método Policy.Execute . Por ejemplo, puede crear cualquier hecho necesario desde la directiva secundaria en este método contenedor. Las siguientes secciones proporcionan un ejemplo para cada método.
Invocar el método Policy.Execute directamente desde la directiva principal
En esta sección se presentan los pasos generales para invocar la directiva secundaria desde la directiva primaria mediante el método Policy.Execute directamente.
Agregar la acción Policy.Execute a la directiva principal
El siguiente procedimiento tiene pasos para agregar el método Policy.Execute como una acción a la directiva primaria que pasa un documento XML como un hecho a la directiva secundaria.
Para agregar el método Policy.Execute como acción a una directiva
En la ventana Explorador de hechos, haga clic en la pestaña Clases de .NET .
Haga clic con el botón derecho en Ensamblados de .NET y, a continuación, haga clic en Examinar.
Seleccione Microsoft.RuleEngine en la lista Ensamblados de .NET y, a continuación, haga clic en Aceptar.
Expanda Directiva.
Arrastre Execute(Object facts) o Execute(Object facts, IRuleSetTrackingInterceptor trackingInterceptor) al panel THEN.
Haga clic en el nodo Esquemas XML .
Nota
En este escenario de ejemplo, un documento XML que se envía como un hecho a la directiva principal se transfiere como hecho a la directiva secundaria. En lugar de ello, puede invocar un método .NET que cree los hechos para la directiva secundaria.
Haga clic con el botón derecho en Esquemas y, a continuación, haga clic en Examinar.
Seleccione el esquema del documento XML que desea pasar como un hecho y, a continuación, haga clic en Abrir.
Arrastre <Schema name.xsd> al primer argumento del método Policy.Execute para pasar el documento XML que se pasa a la directiva primaria como un hecho a la directiva secundaria.
Si usa el método Execute que no toma IRuleSetTrackingInterceptor como segundo argumento, omita los pasos siguientes.
Haga clic en la pestaña Clases de .NET .
Arrastre DebugTrackingInterceptor en Microsoft.RuleEngine al segundo argumento del método Policy.Execute .
Nota
Si realiza esta acción, el cliente debe pasar una instancia de la clase DebugTrackingInterceptor como un hecho a la directiva primaria, que a su vez pasa la instancia como un hecho a la directiva secundaria. En su lugar, podría arrastrar el constructor de la clase DebugTrackingInterceptor para que la instancia se cree automáticamente.
Modificar la aplicación cliente que invoca la directiva principal
El cliente que invoca la directiva primaria crea una instancia de la clase Policy con el nombre de la directiva secundaria como parámetro y lo pasa como un hecho a la directiva primaria junto con otros hechos. En el siguiente código de ejemplo se ilustra esta acción:
DebugTrackingInterceptor dti = new DebugTrackingInterceptor("PolicyTracking.txt");
Policy policy = new Policy("ParentPolicy");
object[] facts = new object[3];
facts[0] = txd;
facts[1] = new Policy("ChildPolicy");
facts[2] = new DebugTrackingInterceptor("PolicyTracking2.txt");
policy.Execute(facts, dti);
policy.Dispose();
Si el cliente es una orquestación de BizTalk, es posible que tenga que colocar el código para crear hechos en una forma expresión y, a continuación, pasar los hechos como parámetros a la forma Reglas de llamada .
Invocar un método contenedor .NET desde la directiva principal
En esta sección se presentan los pasos generales para invocar un método .NET que encapsula la llamada al método Policy.Execute de la directiva primaria.
Crear la clase de utilidad .NET
Para crear la clase de utilidad
Cree un proyecto de biblioteca de clases .NET y, a continuación, agregue una clase al proyecto.
Agregue un método estático que llame al método Policy.Execute para invocar la directiva cuyo nombre se pasa como parámetro, como se muestra en el código de ejemplo siguiente:
public static void Execute(string policyName, TypedXmlDocument txd) { DebugTrackingInterceptor dti = new DebugTrackingInterceptor("PolicyTracking.txt"); Policy policy = new Policy("ParentPolicy"); object[] facts = new object[3]; facts[0] = txd; facts[1] = new Policy("ChildPolicy"); facts[2] = new DebugTrackingInterceptor("PolicyTracking2.txt"); policy.Execute(facts, dti); policy.Dispose(); }
Asegúrese de que la clave del Registro StaticSupport esté establecida en 1 o 2. Para obtener más información sobre la clave del Registro, vea Invocar miembros estáticos de una clase.
Nota
Puede usar un método de instancia en lugar de un método estático. Recuerde que si usa un método de instancia, el cliente debe transferir una instancia de la clase .NET del asistente como hecho a la directiva principal.
Modificar la aplicación cliente
El cliente invoca la directiva principal y esta invoca el método del asistente que invoca la directiva secundaria. El código de ejemplo para el cliente es el siguiente:
facts[0] = txd;
facts[1] = new PolicyExecutor(txd);
//call the first or parent policy
Policy policy = new Policy(policyName);
DebugTrackingInterceptor dti = new DebugTrackingInterceptor("PolicyTracking.txt");
policy.Execute(facts, dti);
policy.Dispose();
Nota
Si el método es de instancia, el cliente debe crear una instancia de la clase .NET del asistente y transferirla como hecho a la directiva principal.
Nota
Si el cliente es una orquestación de BizTalk, es posible que tenga que colocar el código para crear hechos en una forma expresión y, a continuación, pasar los hechos como parámetros a la forma Reglas de llamada .