Skip to content

Instantly share code, notes, and snippets.

@Fhernd
Created June 6, 2014 23:00
Show Gist options
  • Save Fhernd/d325de84867e54fbbd10 to your computer and use it in GitHub Desktop.
Save Fhernd/d325de84867e54fbbd10 to your computer and use it in GitHub Desktop.
Demostración de reflection para la creación de una factoria de plugins en C#.
using System;
using System.Reflection;
namespace Recetas.Cap03
{
// Interfaz común para plugins:
public interface IPlugin
{
string Descripcion
{
get;
set;
}
// Inicia un plugin:
void Iniciar();
// Deteiene un plugin:
void Detener();
}
// Clase abstracta común para todas clases concretas
// de plugins:
public abstract class PluginAbstracto: IPlugin
{
private string descripcion;
// Establece y obtiene la descripción del plugin:
public string Descripcion
{
get
{
return descripcion;
}
set
{
descripcion = value;
}
}
// Las clases derivadas deben crear la implementación
// concreta de los métodos abstractos:
public abstract void Iniciar();
public abstract void Detener();
}
// Plugin concreto:
public class PluginBasico : PluginAbstracto
{
// Implementación particular de `Iniciar`:
public override void Iniciar()
{
Console.WriteLine ("Descripción: {0}\n\tEstado: Iniciando", Descripcion);
}
// Implementación particular de `Detener`:
public override void Detener()
{
Console.WriteLine ("Descripción: {0}\n\tEstado: Deteniendo", Descripcion);
}
}
// Representa la factoría de instancias de plugins:
public sealed class FactoriaPlugins
{
public static IPlugin CrearPlugin(string assembly, string nombrePlugin, string descripcion)
{
// Obtención de la representación Type del plugin:
Type tipo = Type.GetType(nombrePlugin + ", " + assembly);
// Obtención de constructor:
ConstructorInfo ctorInfo = tipo.GetConstructor( Type.EmptyTypes);
// Crear el objeto:
IPlugin plugin = ctorInfo.Invoke(null) as IPlugin;
// Establece una descripción para el plugin:
plugin.Descripcion = descripcion;
return plugin;
}
}
// «Client»
public sealed class Aplicacion
{
public static void Main()
{
Console.WriteLine();
// Creación de un plugin utilziando `FactoriaPlugins`:
IPlugin plugin = FactoriaPlugins.CrearPlugin(
"Factoria",
"Recetas.Cap03.PluginBasico",
"Plugin de capacidades básicas"
);
// Inicio de la carga del plugin:
plugin.Iniciar();
// Detiene el plugin:
plugin.Detener();
Console.WriteLine ();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment