Created
June 6, 2014 23:00
-
-
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#.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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