Estoy creando una aplicación basada en .NET y me gustaría permitir un diseño más extensible y conectable.Permitir que los complementos de C# se registren en los ganchos de la aplicación
En aras de la simplicidad, la aplicación expone un conjunto de operaciones y eventos:
- DoSomething()
- DoOtherThing()
- OnError
- onSuccess
I le gustaría ofrecer "complementos" para cargar y enganchar en algunas de estas operaciones (algo así como: cuando se dispara el evento 1, ejecute el plugin1).
Por ejemplo RUN - plugin1.HandleError() cuando el OnError incendios de evento.
Esto se puede hacer fácilmente con la suscripción de eventos:
this.OnError += new Plugin1().HandleError();
El problema es que:
- Mi aplicación no sabe del tipo "Plugin1" (que es un plug-in, mi aplicación no hace referencia directamente).
- Al hacerlo creará el plugin antes de tiempo, algo que no quiero hacer .
En los modelos de plugins "tradicionales", la aplicación ("cliente" de complementos) carga y ejecuta el código de complemento en ciertos puntos clave.Por ejemplo, una aplicación de procesamiento de imágenes, cuando se realiza una determinada operación).
La aplicación cliente conoce el control de cuándo crear una instancia del código del complemento y cuándo ejecutarlo.
En mi aplicación, el plugin en sí es para decidir cuándo se debe ejecutar ("El complemento debe registrarse en el evento OnError").
Mantener el código de "ejecución" del complemento junto con el código de "registro" plantea un problema que la DLL del complemento se cargará en la memoria en el momento del registro, algo que deseo evitar.
Por ejemplo, si agrego un método Register() en el plugin DLL, el plugin DLL tendrá que cargarse en la memoria para que se llame al método Register.
¿Qué podría ser una buena solución de diseño para este problema en particular?
- Lazily cargando (u ofreciendo carga lenta/con ganas) de archivos DLL de complementos.
- Permitir que los complementos controlen en qué partes del sistema/aplicación se conectan.
el inconveniente de esta estrategia es muy lento al cargar el conjunto. Este es un problema común para la reflexión en .Net –
Gracias ya sé cómo hacer esto. Lo que me gustaría diseñar es una forma de permitir que el complemento se registre en ciertos eventos, sin cargarlo de antemano. –
No creo que sea posible que el complemento dll haga * cualquier cosa * hasta que esté realmente cargado. Una solución es poner una clase de definición de complemento en cada ensamblado de complemento que configura el complemento/le dice al host sobre sus capacidades. Cuando se inicia la aplicación, puede encontrar todas las clases de definición y tomar la acción adecuada (tal vez simplemente llamar a un método de "Configurar" en cada una). –