2009-02-05 15 views
9

Tengo que desarrollar un sistema para monitorear la información del sensor, pero muchos sensores podrían agregarse en el futuro.Sistema con complementos en C#

Dicho esto, la idea sería desarrollar un sistema que consista en el esqueleto de la aplicación. Los sensores (ya que cada uno de ellos tiene sus características de comunicación y presentación de datos) se agregarían como complementos al sistema.

¿Cómo codificaría esto en C#? ¿Es un caso de desarrollo impulsado por componentes? ¿Debo usar bibliotecas dinámicas?

Respuesta

10

Hay una gran cantidad de sistemas ad-hoc enchufables para C#. Uno se describe en Plugin Architecture using C# (en The Code Project). El enfoque general es que la aplicación host publica un ensamblaje con interfaces. Se enumera a través de una carpeta y encuentra conjuntos que definen una clase que implementa sus interfaces y las carga y crea instancias de las clases.

En la práctica, desea hacer más. Lo mejor es que la aplicación de host defina dos interfaces, un IHost y un IPlugIn. La interfaz de IHost proporciona servicios a los que un complemento puede suscribirse. El IPlugIn se construye tomando un IHost.

Para cargar un complemento, debe hacer más que simplemente obtener un plug-in. Debe enumerar todos los complementos que se pueden cargar. Constrúyelos a cada uno. Pregúntales si pueden correr. Pídales exportar API en el host. Pídales que importen API del host. Los complementos deberían poder preguntar sobre la existencia de otros complementos.

De esta manera, los complementos pueden ampliar la aplicación al ofrecer más API.

Los plugins deben incluir eventos. De esta forma, los complementos pueden monitorear el proceso de carga y descarga de los complementos.

En el fin del mundo, debe advertir a los complementos que se van a ir. Entonces sácalos.

Esto le dejará con una aplicación que se puede escribir en un marco pequeño y se puede implementar completamente en complementos si lo desea.

Como una ventaja adicional, también debe hacerlo de modo que en la carpeta de complementos, resuelva los accesos directos a los complementos. Esto le permite escribir su aplicación y entregársela a otra persona. Pueden crear un complemento en su entorno de desarrollo, crear un acceso directo a él en la carpeta de complementos de la aplicación y no tener que preocuparse por la implementación después de cada compilación.

+1

¿Sabe cuánto de este MEF es capaz de hacer? –

9

Managed Extensibility Framework (MEF) es lo que necesita aquí. También podría usar un contenedor dependency injection, pero eso no es lo que usted esperaría, aunque es una solución perfectamente viable en sí misma.

+0

Prometedor de hecho, pero la idea de desarrollo insuficiente hace que no sea bueno para este proyecto, ya que es por trabajo. – Rodrigo

+0

MEF se usará (y en realidad se usa) en Visual Studio 2010 y se enviará como parte de .NET Framework 4.0 –

3

Cada sensor debe implementar una interfaz estándar para que las rutinas que manejan las listas de sensores puedan tratarlas de manera estándar. Incluya un campo de ID en la interfaz que también sea único para cada tipo de sensor para que pueda manejar casos especiales.

Mire la Reflection API para aprender a escanear un directorio de .NET Assemblies y ver dentro de ellos.

Cada conjunto debe tener una clase de fábrica que su trabajo es devolver una lista de los sensores que se encuentran en ese conjunto. Te recomiendo que conviertas una subrutina en una función y le pasa una lista que también se agrega. SensorDLL1 agrega 4 sensores a la lista vacía, SensorDLL2 agrega 8 sensores a la lista que ahora tiene 12 sensores, etc. Este enfoque es el más flexible a largo plazo.

Deberá crear una convención de nomenclatura para encontrar la clase de fábrica o utilizar un atributo. Nota: No recomiendo solo escanear el ensamblaje para ver todo lo que implementa su interfaz de sensor, ya que podría tener un código dentro de la fábrica que controle qué sensores están disponibles. Esto es útil para licenciar.

1

Dependiendo de los sensores en sí, parece que tendría que definir una única interfaz que todos los sensores implementarán. Su "esqueleto de aplicación" principal funcionará entonces contra la interfaz ISensor y no necesita preocuparse por las implementaciones concretas de cada una de las clases/objetos/componentes del Sensor.

Si cada sensor es simplemente una clase dentro del mismo proyecto, o un ensamblaje separado depende de usted, aunque si son ensamblajes separados, necesitaría una forma de cargar estos ensambles dinámicamente.

Algunas referencias que pueden ayudar aquí son:

Comando Patrón de patrones de diseño: - http://en.wikipedia.org/wiki/Command_pattern

Observador Diseño Patrón: - http://en.wikipedia.org/wiki/Observer_pattern

asambleas Carga dinámica: - http://www.divil.co.uk/net/articles/plugins/plugins.asp

Espero que esto ayude.

1

Una vez hicimos un sistema de plug-in en un proyecto escolar nuestro en 2006, Socio. Puede encontrar el código here y here.

La lección básica aprendida fue que es muy simplemente para cargar dinámicamente el código en C#. Si solo tiene una DLL de complemento y una aplicación que se adhiere a una interfaz suya y enlaces contra una DLL común en la que existe esa interfaz, simplemente funciona ™.

En esencia, es lo que plinth described in his answer.

0

Es un post muy viejo, pero todavía pensé que sería útil para alguien que appPress.in donde hemos desarrollado en un marco con la funcionalidad plug-in . aquí permitimos que el complemento modifique la interfaz de usuario de la aplicación principal Horizontal y verticalmente, agregue sus propias páginas, enganche en eventos como Init, OnClick y OnChange.

Cuestiones relacionadas