Implementando un Plugin en C# (Usando Bibliotecas de Reflection)


EDIT: Con el tiempo he aprendido otras tecnicas para crear plug ins, aqui hay un articulo con un par de ellas https://hmadrigal.wordpress.com/2010/03/28/writing-a-plug-in/ lamentablemente lo escribi en ingles, hay un ejemplo. 😛

Yo siempre me pregunte como trabajan los plugins. Entonces, yo lei articulos acerca de eso, y encontre algunas interesantes ideas. Yo he encontrado una manera para implementar plugins, que no significa que sea la ultima, pero usted puede investigar mas si esta idea no es suficiente.

When debo utilizar plugins?
Solo puedo pensar en escenarios como:

Cuando las reglas de negocios cambian muy amenudo y no quiero recompilar la aplicacion entera para actualizarla.
Para poder dar oportunidad a un tercero de implementar funcionalidad en mi aplicacion.

Entonces, que necesito para un plugin?

1. Definir un Contrato: Esta parte de la aplicacion esta a cargo de exponer toda las tareas que el pluing tiene que implementar, y tambien expone los recursos de la aplicacion que el plug in es capaz de acceder.
2. Implementacion del contrato: Esta es la implementacion de las tareas.
3. El cargador de plugins: Esta es la parte de la aplicacion encargada de cargar los archivos relacionados a la aplicacion. El resultado final es tener una manera de accessar todos los plugins cargados, junto con sus miembros.

Suena facil verdad?, de hecho, es facil!, el unico detalle es como implementar cada paso en su lenguaje de preferencia.

Yo he implementado un simple ejemplo utilizando C# 3.0, LINQ y genericos. Yo me base en un ejemplo de un articulos que encontre en internet, sin embargo agrege el soporte para genericos y LINQ para sacar ventaja del .NET framework 3.5.

Paso 1: Contrato del Plugin
En C# la mas comun manera para defininr un contrato es por medio del uso de interfaces. Entonces, nosotros solamente necesitamos creat un proyecto que almacene toas las interfaces que el plugin necesita sean implementadas, y los recursos que son compartidos entre el plug in y la aplicacion.

Paso 2: Implementacion del Plugin
Ahora tenemos que creat una clase que implemente (lo cual quiere decir escribir funcionalidad) para el contrato del paso anterior.

Step 3: Plugin loaders
Esta es la parte dificil de esto, nuestra applicacion va ha cargar archivos binarios. Estos archivos van a ser incorporados a nuestra applicacion en ejecucion. Despues de esto, nosotros podremos llamar (si se requiere) una tarea en particular de nuestro plugin. Para lograr esto en C#, nosotros utilizamos el concepto de ‘late binding’, que esta dentro del .NET framwork. Esto permite a nuestra applicacion cargar los archivos binarios en tiempo de ejecucion. Tambien al utilizar reflexion nosotros podemos generar instances de las clases de los archivos binarios.

Here is a screenshot of my sample in C#:

Adjunto un codigo de ejemplo de como implementar un cargador de plugins.
https://github.com/hmadrigal/playground-dotnet/tree/master/MsDotNet.PluginWithReflection
http://hmadrigal.googlepages.com/Transtool.zip

Tambien puede chequear estos buenos articulos:

Creating a Flexible Dynamic Plugin Architecture under .NET
http://www.codeproject.com/KB/dotnet/PluginManagerClassBrk.aspx?fid=26061&df=90&mpp=25&noise=3&sort=Position&view=Quick

ASP.NET Technical Articles – Creating a Plug-In Framework
http://msdn.microsoft.com/en-us/library/ms972962.aspx

Dynamic Loading Made Simple
http://www.codeproject.com/KB/library/dynamicloading.aspx

Enabling Your Application to Become a Plugin Host
http://www.codeproject.com/KB/cs/Plugin_Basics.aspx

Let Users Add Functionality to Your .NET Applications with Macros and Plug-Ins
http://msdn.microsoft.com/en-us/magazine/cc164072.aspx

Plugin Architecture using C#
http://www.codeproject.com/KB/cs/c__plugin_architecture.aspx

Saludos,
Herberth

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s