Advertisement
Fhernd

GestorPlugins.cs

Jul 27th, 2014
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.22 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Reflection;
  4. using System.Threading;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.Collections.Specialized;
  8.  
  9. namespace Recetas.Cap03
  10. {
  11.     ///<summary>
  12.     /// Interfaz con contrato estándar para plugins.
  13.     ///</summary>
  14.     public interface IPlugin
  15.     {
  16.         ///<summary>
  17.         /// Inicia la ejecución/carga del plugin.
  18.         ///</summary>
  19.         void Iniciar();
  20.         ///<summary>
  21.         /// Detiene la ejecución/carga del plugin.
  22.         ///</summary>
  23.         void Detener();
  24.     }
  25.    
  26.     ///<summary>
  27.     /// Implementación de una clase que representa un
  28.     /// plugin abstracto (ejemplo demostrativo).
  29.     ///</summary>
  30.     public class PluginBasico : IPlugin
  31.     {
  32.         public void Iniciar()
  33.         {
  34.             Console.WriteLine("El dominio {0} ha iniciado su carga...",
  35.                 AppDomain.CurrentDomain.FriendlyName.ToString());
  36.         }
  37.        
  38.         public void Detener()
  39.         {
  40.             Console.WriteLine("El dominio {0} ha iniciado su descarga...",
  41.                 AppDomain.CurrentDomain.FriendlyName.ToString());
  42.         }
  43.     }
  44.    
  45.     ///<summary>
  46.     /// Esta es la clase encargad de la gestión de plugins.
  47.     /// Facilita la carga de los plugins en un dominio de
  48.     /// aplicación específico.
  49.     ///</summary>
  50.     public class GestorPlugins : MarshalByRefObject
  51.     {
  52.         // Estructura de datos (diccionario) que mantiene
  53.         // referencias de a los plugins que gestionará.
  54.         private Dictionary<string, IPlugin> plugins = new Dictionary<string, IPlugin>();
  55.        
  56.         public GestorPlugins()
  57.         {
  58.        
  59.         }
  60.        
  61.         ///<summary>
  62.         /// Constructor de `GestorPlugins` que carga
  63.         /// una serie (diccionario) de plugins en su
  64.         /// momento de instanciación
  65.         ///</summary>
  66.         public GestorPlugins(NameValueCollection listaPlugins)
  67.         {
  68.             // Carga la lista de plugins en `listaPlugins`:
  69.             foreach (string plugin in listaPlugins.Keys)
  70.             {
  71.                 CargarPlugin(listaPlugins[plugin], plugin);
  72.             }
  73.         }
  74.        
  75.         ///<summary>
  76.         /// Método que se encarga de la carga de un assembly, y la
  77.         /// instanciación de un plugin del assembly en cuestión.
  78.         ///<summary>
  79.         public bool CargarPlugin(string nombreAssembly, string nombrePlugin)
  80.         {
  81.             try
  82.             {
  83.                 // Carga el assembly:
  84.                 Assembly assembly = Assembly.Load(nombreAssembly);
  85.                
  86.                 // Creación de una instancia de la implementación del plugin:
  87.                 IPlugin plugin = assembly.CreateInstance(nombrePlugin, true) as IPlugin;
  88.                
  89.                 if (plugin != null)
  90.                 {
  91.                     // Se agrega el plugin al diccionario:
  92.                     plugins[nombrePlugin] = plugin;
  93.                    
  94.                     // Carga satisfactoria:
  95.                     return true;
  96.                 }
  97.                 else
  98.                 {
  99.                     return false;
  100.                 }
  101.             }
  102.             catch
  103.             {
  104.                 return false;
  105.             }
  106.         }
  107.        
  108.         ///<summary>
  109.         /// Inicia el plugin:
  110.         ///</summary>
  111.         public void IniciarPlugin(string plugin)
  112.         {
  113.             try
  114.             {
  115.                 plugins[plugin].Iniciar();
  116.             }
  117.             catch
  118.             {
  119.                 // En caso de que la inicialización del
  120.                 // plugin genere errores, se crea un
  121.                 // registro de la actividad.
  122.             }
  123.         }
  124.        
  125.         ///<summary>
  126.         /// Detiene la ejecución del plugin.
  127.         ///</summary>
  128.         public void DetenerPlugin(string plugin)
  129.         {
  130.             try
  131.             {
  132.                 plugins[plugin].Detener();
  133.             }
  134.             catch
  135.             {
  136.                 // En caso de que el detenimiento del
  137.                 // plugin genere errores, se crea un
  138.                 // registro de la actividad.
  139.             }
  140.         }
  141.        
  142.         ///<summary>
  143.         /// Carga un listo de listado completo de plugins.
  144.         ///</summary>
  145.         public ArrayList ListaPlugins()
  146.         {
  147.             return new ArrayList(plugins.Keys);
  148.         }
  149.        
  150.         public class Aplicacion
  151.         {
  152.             public static void Main()
  153.             {
  154.                 Console.WriteLine();
  155.                 // Demostración del uso del constructor de `GestorPlugins`
  156.                 // con un cero-argumentos:
  157.            
  158.                 // Creación de un dominio de aplicación:
  159.                 AppDomain nuevoDominio1 = AppDomain.CreateDomain("NuevoDominio1");
  160.                
  161.                 // Creamos una instancia de `GestorPlugins` con el constructor
  162.                 // por defecto (cero-argumentos):
  163.                 GestorPlugins gestor1 = (GestorPlugins) nuevoDominio1.CreateInstanceAndUnwrap(
  164.                     "GestorPlugins", "Recetas.Cap03.GestorPlugins"
  165.                 );
  166.                
  167.                 // Carga de un plugin básico sobre el gestor de plugins:
  168.                 gestor1.CargarPlugin("GestorPlugins", "Recetas.Cap03.PluginBasico");
  169.                
  170.                 // Operaciones de inicio y detentención del plugin en el
  171.                 // dominio de aplicación `nuevoDominio1`
  172.                 // (Especificación de nombre de clase completamente calificado):
  173.                 gestor1.IniciarPlugin("Recetas.Cap03.PluginBasico");
  174.                 Thread.Sleep(1000);
  175.                 gestor1.DetenerPlugin("Recetas.Cap03.PluginBasico");
  176.                
  177.                 Console.WriteLine();
  178.                 Thread.Sleep(2000);
  179.                
  180.                
  181.                 // Demostración del uso del constructor de `GestorPlugins`
  182.                 // con un argumento:
  183.                
  184.                 // Creación otro dominio de aplicación:
  185.                 AppDomain nuevoDominio2 = AppDomain.CreateDomain("NuevoDominio2");
  186.                
  187.                 // Creación de un conjunto de plugins:
  188.                 NameValueCollection listaPlugins = new NameValueCollection();
  189.                
  190.                 // `Aplicacion.exe` es el assembly actual:
  191.                 listaPlugins["Recetas.Cap03.PluginBasico"] = "GestorPlugins";
  192.                
  193.                 // Creamos otra instancia de `GestorPlugins`:
  194.                 GestorPlugins gestor2 = (GestorPlugins) nuevoDominio2.CreateInstanceAndUnwrap(
  195.                     "GestorPlugins", "Recetas.Cap03.GestorPlugins", true, 0, null,
  196.                     new object[] { listaPlugins }, null, null
  197.                 );
  198.                
  199.                 // Despliegue de los plugins cargados en el dominio de
  200.                 // aplicación `nuevoDominio2`:
  201.                 Console.WriteLine("\n\nPlugis cargados en `nuevoDominio2`:");
  202.                 foreach (string s in gestor2.ListaPlugins())
  203.                 {
  204.                     Console.WriteLine("\t{0}", s);
  205.                 }
  206.                
  207.                 Console.WriteLine();
  208.             }
  209.         }
  210.     }
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement