[HOWTO] Impersonar otro usuario para ejecutar código en X++

A pesar de que esto no es habitual y va contra unas cuentas Best Practices, en algunos casos muy específicos podemos necesitar ejecutar un framento de X++ (una llamada a un método) en el contexto de un usuario que no es el que está ejecutando la sesión actual, ya sea una sesión de cliente o un proceso Batch. Para ejecutar una llamada a un método con un usuario concreto, usamos este código:

// ...

// Usuario que va a ejecutar el método
UserId postingUserId = parms.PostingUserId != '' ? parms.PostingUserId : curUserId();

new RunAsPermission(postingUserId).assert();

// Llamada a: MyClass.myClassMethod(methodParm1, methodParm2)

// BP Deviation Documented
runAs(postingUserId, classNum(MyClass), 'myClassMethod', [methodParm1, methodParm2]);

CodeAccessPermission::revertAssert();

// ...

Insisto en que esto no es habitual y tiene, como siempre que hacemos estas cosas, algunos riesgos de seguridad. Pero dejo aquí el código para buscarlo la próxima vez que lo necesite 😉

Microsoft Dynamics AX Design Patterns

Dado el tamaño y la inmensa funcionalidad incluida en Microsoft Dynamics AX, parece lógico pensar que se han seguido diferentes patrones de diseño para implementarlo, y en efecto así es.

Conocer y respetar estos patrones de diseño y tambien las buenas practicas es muy importante para mantener un buen nivel en nuestros desarrollos y procurar no “romper” el funcionamiento estándar de la aplicación con nuestras modificaciones, si bien no todos ellos estan completamente documentados, la mayoría se perfeccionan con la experiencia, pero la base se puede aprender mediante la documentación oficial:

Estos patrones no son arbitrarios, como se puede comprobar la mayoría se basan en patrones de diseño mas o menos estándar o al menos comunmente reconocidos como válidos, por ejemplo:

Continue Reading…