2009-01-05 9 views
8

He estado trabajando en una biblioteca de servicios de WCF donde espero que toda la lógica de negocios termine viviendo. El problema al que me estoy enfrentando es que a veces tengo que hacer correcciones rápidas a un servicio y para aplicar esas correcciones, tengo que detener el servicio de Windows, reemplazar el dll del servicio y luego reiniciar el servicio de Windows. Esto comenzará a causar más dolores de cabeza a medida que comencemos a migrar cada vez más de nuestra lógica a esta capa y tengamos que cerrar todo el servicio para poder realizar cualquier cambio.La mejor manera de crear una biblioteca de servicios de WCF conectable en caliente

Lo que me gustaría hacer es crear un shell vacío de un servicio de Windows y cargar y descargar dinámicamente los servicios. ¿Cuál es la mejor manera de cargar y descargar archivos DLL .Net a pedido? ¿O es mejor confiar en IIS para este tipo de servicio?

Respuesta

8

Si está usando WCF, un nombre con el que debe familiarizarse es Juval Lowy. Es el fundador de IDesign y uno de los expertos más reconocidos con respecto a WCF. Su libro Programming WCF Services es muy recomendable.

IDesign website ofrece toda una serie de descargas gratuitas relacionadas con WCF. Todo lo que tiene que hacer es proporcionar su dirección de correo electrónico y cumplir con el acuerdo de licencia estándar de IDesign.

De particular interés para usted puede ser App Domain Host, In-Proc Factory, y las descargas de In-Proc Hosting encontradas en here.

2

Probablemente pueda utilizar la reflexión para cargar dinámicamente la lógica específica que necesita, pero el rendimiento alcanzado en sus servicios será tremendo al hacer lo que quiere que describa.

Si no ha utilizado la reflexión antes, aquí hay una muestra que obtuve de un proyecto que tengo. Muestra cómo cargar un ensamblaje y llamar a un método con algunos parámetros.

Assembly a = GetAssembly(); 
Type t = ExportModule.GetExportType(a); 
if (t == null) throw new Exception("No proper type found."); 

object iExportModule = Activator.CreateInstance(t); 
object[] arguments = new object[] { _export.ConnectionString, GetFileName() }; 

t.InvokeMember("ExecuteExport", BindingFlags.Default | BindingFlags.InvokeMethod, 
    null, iExportModule, arguments); 

Obviamente no sé su entorno, pero en general yo diría que es mucho mejor para cerrar el servicio durante unos minutos para actualizar el software que cambiar toda su paradigma a ser dinámico.

Si realmente tiene arreglos constantes que requieren que el servicio baje, no creo que deba tener un solo servicio central. Lo tomarías todo el tiempo. Es mejor tener servicios separados que se ocupen de diferentes funciones lógicas para que no se reduzca toda su aplicación (punto único de falla).

1

Una vez que se haya cargado un conjunto en un AppDomain, permanecerá en la memoria hasta que ese AppDomain se descargue y se destruya. Por lo tanto, para simular un entorno "conectable en caliente", debe configurar y eliminar AppDomains (del AppDomain principal del proceso) que alojará los ensamblados comerciales reales y ejecutará la lógica de la aplicación.

No hace falta decir que debe esperar una degradación del rendimiento si constantemente crea/destruye AppDomains por llamada de servicio WCF. Está destinado a crear un límite operativo aislado de su dominio de aplicación principal para realizar un trabajo significativo que dure una buena duración. La ventaja de AppDomains es que puede conserve memory usage si tiene muchos ensambles de lógica de negocios que le gustaría descargar con el tiempo.

El principal ejemplo de este tipo de configuración dinámica y desmontaje es ASP.NET. El tiempo de ejecución de ASP.NET crea un dominio de aplicación para cada aplicación web. Si algo cambia en el sitio web, como web.config, se descarga AppDomain y se instala una nueva configuración de AppDomain para la nueva versión de la aplicación web, el reciclaje de la aplicación.

0

Pruebe usar MEF para administrar dependencias junto con MAF (System.AddIn) para cargar/descargar complementos.

Cuestiones relacionadas