Monikers compuestos
Una de las características más útiles de monikers es que puede concatenar o componer monikers juntos. Un moniker compuesto es un moniker que es una composición de otros monikers y puede determinar la relación entre las partes. Esto le permite ensamblar la ruta de acceso completa a un objeto dados dos o más monikers equivalentes a rutas de acceso parciales. Puede componer monikers de la misma clase (como dos monikers de archivo) o de clases diferentes (como un moniker de archivo y un moniker de elemento). Si fuera a escribir su propia clase de moniker, también podría componer sus monikers con monikers de archivo o elemento. La ventaja básica de un compuesto es que proporciona un fragmento de código para implementar cada moniker posible que es una combinación de monikers más simples. Esto reduce significativamente la necesidad de clases de moniker personalizadas específicas.
Dado que los monikers de diferentes clases se pueden componer entre sí, los monikers proporcionan la capacidad de combinar varios espacios de nombres. El sistema de archivos define un espacio de nombres común para los objetos almacenados como archivos porque todas las aplicaciones entienden un nombre de ruta de acceso del sistema de archivos. Del mismo modo, un objeto contenedor también define un espacio de nombres privado para los objetos que contiene porque ningún contenedor entiende los nombres generados por otro contenedor. Los monikers permiten que estos espacios de nombres se unan porque los monikers de archivos y los monikers de elementos se pueden componer. Un cliente de moniker puede buscar en el espacio de nombres todos los objetos mediante un único mecanismo. El cliente simplemente llama a IMoniker::BindToObject en el moniker y el código de moniker controla el resto. Una llamada a IMoniker::GetDisplayName en un compuesto crea un nombre mediante la concatenación de todos los nombres para mostrar de los monikers individuales.
Además, dado que puede escribir su propia clase de moniker, la composición de moniker permite agregar extensiones personalizadas al espacio de nombres para los objetos.
A veces, se pueden combinar dos monikers de clases específicas de forma especial. Por ejemplo, un moniker de archivo que representa una ruta de acceso incompleta y otro moniker de archivo que representa una ruta de acceso relativa se puede combinar para formar un único moniker de archivo que represente la ruta de acceso completa. Por ejemplo, los monikers de archivo "c:\work\art" podrían estar compuestos con el moniker de archivo relativo ".. \backup\myfile.doc" igual a "c:\work\backup\myfile.doc". Este es un ejemplo de composición no genérica.
Por otro lado, la composición genérica permite la conexión de dos monikers, independientemente de sus clases. Por ejemplo, podría crear un moniker de elemento en un moniker de archivo, aunque no, por supuesto, al revés.
Dado que una composición no genérica depende de la clase de los monikers implicados, sus detalles se definen mediante la implementación de una clase de moniker determinada. Puede definir nuevos tipos de composiciones no genéricas si escribe una nueva clase de moniker. Por el contrario, OLE define composiciones genéricas. Los monikers creados como resultado de la composición genérica se denominan monikers compuestos genéricos.
Estas tres clases, monikers de archivo, monikers de elementos y monikers compuestos genéricos, todos funcionan juntos y son las clases de monikers más usadas.
Los clientes de Moniker deben llamar a IMoniker::ComposeWith para crear un compuesto en el moniker con otro. El moniker en el que se llama decide internamente si puede hacer una composición genérica o no genérica. Si la implementación del moniker determina que se puede usar una composición genérica, OLE proporciona la función CreateGenericComposite para facilitarlo.
Temas relacionados