Traducción: Mono.Addins – Punto de Extensión y Extensiones

Introducción

Este artículo es una traducción del original disponible en [1], las licencias aplicadas al original se aplican a la traducción.

mono-logo

La traducción

Una aplicación basada en Mono.Addins se compone de:

  1. Una aplicación huésped (o un huésped de complementos (add-in)), que contiene varios puntos de extensión (extension points).
  2. Varios complementos, que extienden los puntos de extensión del huesped (host)

Implementando un huesped de complementos

El código inmediatamente inferior es un ejemplo básico de una aplicación que contiene complementos, es decir, hace de huésped de complementos. Esta aplicación ejecuta un conjunto de comandos que pueden ser implementados como complementos (add-in).

   1:  using System;
   2:  using Mono.Addins;
   3:   
   4:  [assembly:AddinRoot ("HelloWorld", "1.0")]
   5:   
   6:  class MainClass
   7:  {
   8:      public static void Main ()
   9:      {
  10:          AddinManager.Initialize ();
  11:          AddinManager.Registry.Update ();
  12:          
  13:          foreach (ICommand cmd in AddinManager.GetExtensionObjects<ICommand> ())
  14:              cmd.Run ();
  15:      }
  16:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Este código muestra declaraciones e inicializaciones que tienen que hacerse en todas las aplicaciones extensibles:

  • El atributo [AddinRoot] aplicado a un ensamblado indica que ese ensamblado es un huésped de complementos. Todos los proyectos que incluyan gestión de complementos tendrán un identificador y una versión.
  • La llamada al método AddinManager.Initialize se encarga de inicializar el administrador de complementos (AddinManager). Ante de realizar cualquier operación con la clase AddinManager hay que realizar esta llamada.
  • Cuando se realiza la llamada al método AddinManager.Registry.Update, el motor de complementos inspeccionará la carpeta donde está alojada la aplicación (y otras carpetas indicadas por el programador) buscando complementos, esto actualizará el registro de complementos (add-in registry) que almacena la información sobre los complementos.
  • La llamada al método AddinManager.GetExtensionObjects se puede entender como una consulta a los puntos de extension. Devuelve una lista de objetos registrados en un determinado punto de extensión.

Para completar el ejemplo anterior deberemos declarar los puntos de extensión.

Declarando puntos de extensión

Los puntos de extensión se declaran como indica el siguiente código:

   1:  using Mono.Addins;
   2:   
   3:  [TypeExtensionPoint]
   4:  public interface ICommand
   5:  {
   6:      void Run ();
   7:  }

El atributo [TypeExtensionPoint] cuando se le aplica a una clase o a un interfaz indica que un punto de extensión acepta objetos de ese tipo. En el ejemplo, hemos creado un punto de extensión para los objetos que implementan el interfaz ICommand.

Implementando un Complemento (add-in)

Un complemento extiende un punto de extensión de la siguiente manera:

   1:  using System;
   2:  using Mono.Addins;
   3:   
   4:  [assembly:Addin]
   5:  [assembly:AddinDependency ("HelloWorld", "1.0")]
   6:   
   7:  [Extension]
   8:  public class HelloCommand: ICommand
   9:  {
  10:      public void Run ()
  11:      {
  12:          Console.WriteLine ("Hello World!");
  13:      }
  14:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Los complementos se desarrollan en ensamblados diferentes, tienen que estar marcados con el atributo [Addin] para ser reconocido como un complemento. Los complementos tienen que indicar a que huesped extienden utilizando el atributo AddinDependency, indicando el id del huesped o complemento y el número de versión.

Mediante la aplicación de la [extensión] atributo a una clase que se declara una nueva extensión del nodo que tipo que se agrega a un punto de extensión. El punto de extensión se determina observando la tipos base e interfaces de la clase. Así que en este ejemplo, la clase implementa la ICommand interfaz, y hay un punto de extensión definida para esa interfaz, por lo que es la extensiónpunto en el que el tipo se registrará. Si una clase implementa varias interfaces, podemos seleccionar el punto de extensión, especificando el nombre del tipo en el atributo, por ejemplo: [Extensión (typeof (ICommand))].

Anuncios
Deja un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: