2011-08-16 21 views
5

Problema:
estoy construyendo un marco que acepta un archivo, traduce y ejecuta ella. El framework debería ser capaz de manejar cualquier tipo de archivo, con este fin he proporcionado un método para cargar un archivo DLL que contiene clases y métodos para que traducen y ejecutando un archivo. Lo que busco, es la mejor manera para definir la interfaz de complementospatrón Plugin en C#

Solución A:
definir un conjunto de interfaces que están disponibles públicamente. Los complementos deberían implementar estas interfaces.

Solución B:
definir algunas clases abstractas que están disponibles públicamente. Los complementos deben heredarse y anular los métodos abstractos en estas clases.

Solución C:rcravens
interfaces de pasar alrededor dentro del código, crear una clase abstracta que está disponible públicamente para permitir la extensibilidad plugin. Elegido
Esta solución se eligió antes que la interfaz solo porque permite una implementación básica (útil en este caso). Fue elegido antes de la clase abstracta solo porque permite burlarse dentro del código. Los marcos de composición son excelentes, pero un poco exagerados para algo tan ligero como esta aplicación donde solo se desea una extensibilidad limitada.

Solución D:JayChris Shain y
implementar un marco de composición (como Managed Extensibility Framework(MEF)) y construir a su alrededor

Si aparecen nuevas soluciones, voy a añadir a esta lista. La respuesta va a ir a la persona que es más capaz de justificar su solución (posiblemente con ventajas y limitaciones)

Gracias de antemano,
Tech Prueba Amigo

+0

¿Qué hay de MEF y MAF? No sé a qué te refieres cuando hablas de traducción, pero MEF y MAF (posiblemente enriquecidos con algunas cosas habituales de DI) están hechos para construir aplicaciones compuestas. Es posible que desees que skim lea el código Prism (WPF compuesto), todo se trata de aplicaciones compuestas, también conocidas como módulos/complementos. Si habla de aplicaciones web, la fuente de Orchard CMS también podría ser interesante. Estos chicos han creado una buena infraestructura de complementos además de ASP.NET MVC. – Jay

+0

La aplicación en cuestión es un servicio web, sentado en un servidor. La idea es que muchas personas pueden proporcionar archivos para 'traducción' y algunas personas pueden proporcionar complementos. Cuando las personas proporcionen sus archivos, seleccionarán qué complemento se debe usar para 'traducirlos'. El final de UI real (WPF, MVC, etc.) no es el problema en este momento. Hasta ahora, me he mantenido alejado de los marcos anteriores a la definición, ya que tienden a ser bastante desleales. Corrígeme si estoy en el error –

+0

No he trabajado con MAF todavía y no sé si todavía lo mantiene MS pero creo que al menos MEF debería proporcionar la infraestructura necesaria. No está limitado a cosas de GUI. Aunque creo que @Chris Shain tiene razón, no reinventes la rueda. Por cierto: ¿qué pasa con la seguridad? Quiero decir que alguien podría cargar código malicioso como un complemento. Parece que se requiere una caja de arena. – Jay

Respuesta

3

En el nivel más bajo que creo que necesita las interfaces . Esto permite que la mayoría de los frameworks de burla faciliten falsificaciones. Alrededor de su código debe pasar alrededor de las interfaces. Si necesita una implementación básica que pueda refactorizarse en una clase base abstracta, hágalo. Las clases base y las interfaces abstractas no son conceptos mutuamente excluyentes. Algunas veces tiene sentido tener ambos.

+0

Como ejemplo, tendría 'ITranslator' que declararía todos los métodos válidos para traducir, y una clase abstracta TranslatorBase que declara una implementación básica. El problema entonces surge cuando empiezo a usar la reflexión para buscar las implementaciones dentro de la DLL. ¿Solo busco las implementaciones de 'ITranslator'? ¿O de hecho les pido que hereden 'TranslatorBase'? ¿Cuál de estos es público y cuál es solo para que los internos lo usen? gracias por su respuesta –

+0

Por favor dígame si la edición que hice a la pregunta encapsula suficientemente su respuesta –

3

No creo que haya una mejor solución entre la interfaz o la clase abstracta, realmente depende de lo que necesite. Pero personalmente, probablemente iría con la clase abstracta, por el simple hecho de que ofrece más flexibilidad.

bueno que proporcionara una abstract métodos que son esenciales para definir el comportamiento particular del complemento, mientras que virtual métodos ofrecen una manera de optionnaly anular un comportamiento predeterminado.

La clase abstracta también puede proporcionar algunos métodos de utilidad que podrían ser útiles para los autores del complemento.

Básicamente, una clase abstracta puede ofrecer todos los que ofrece una interfaz, y más. Entonces, probablemente sea mejor para futuras extensiones.

+1

+1 para definir las ventajas de una implementación de clase abstracta –

4

Lo que está escribiendo suena sospechosamente como lo que admite Managed Extensibility Framework: http://mef.codeplex.com/. ¿Tal vez usar eso y evitar reinventar la rueda?

+0

Investigando ahora ... Gracias por el puntero –

+0

MEF sería una buena solución aquí . + 1 –

+0

Se pueden usar algunas líneas de código para implementar un motor de complementos, consulte http://www.c-sharpcorner.com/UploadFile/rmcochran/plug_in_architecture09092007111353AM/plug_in_architecture.aspx, un marco de trabajo pesado no siempre es obligatorio – Aerospace