MEF no soporta el aislamiento dominio de aplicación, por lo que lamentablemente, incluso durante la recomposición, esas asambleas que habían sido previamente cargado están siendo cargados en el dominio de aplicación principal de la aplicación web. Hay dos cosas que había necesidad de combatir en ASP.NET:
Cualquier cambio en los archivos físicos (por ejemplo, .aspx, .cshtml, etc), o cualquier cambio a los archivos de configuración (.config), o cualquier cambio al directorio \ bin causará que la aplicación sea reciclada. Esto se debe a dos cosas: la supervisión de archivos de páginas/configuraciones y la supervisión de archivos del directorio \ bin (que se debe a que ASP.NET utiliza por omisión la copia oculta de archivos, esto es recomendable).
Usar MEF en otro dominio de aplicación requeriría una cantidad espantosa de comunicación entre dominios, ya sea a través de la serialización o MarshalByRef
, lo cual no creo que sea una implementación limpia. No estoy seguro de cómo desencadenarías BuildProvider
instancias utilizadas para compilar dinámicamente tus páginas en otro AppDomain.
Me pregunto si estás pensando en esto demasiado. Desde IIS6, HTTP.SYS ha gestionado el enrutamiento de las solicitudes entrantes al sitio web apropiado, esto se maneja a nivel de kernel. Incluso si la aplicación principal se reinició (que hay una variedad de razones por las que podría), no se eliminarán solicitudes, simplemente cola esperando un nuevo proceso de trabajo antes de pasar la solicitud. Claro, desde el punto de vista del usuario, es posible que observe algún tiempo de inactividad esperando que la nueva aplicación se reinicie, pero de forma realista, ¿con qué frecuencia hará estos cambios?
Muchos diseños de aplicaciones sufren de sobreingeniería. Es posible que desee diseñar para cada escenario, pero de manera realista es más fácil mantener un sistema que es simple pero extensible. En mi opinión, querer hacer lo que ha especificado se clasificaría como sobreingeniería. Mantenlo simple.
Entonces, su recomendación en pocas palabras es reciclar el grupo y luego volver a cargar los nuevos ensamblajes? ¿Te estoy entendiendo correctamente? – Mark
En una palabra, sí. Puede parecer una respuesta decepcionante para usted, pero las aplicaciones ASP.NET están diseñadas para ejecutarse de esta manera. Cuando planifica el conjunto de características para su aplicación, vale la pena considerar si la característica que está diseñando es para los casos de uso más comunes o no. ¿Tiene sentido? –
Tuve la idea de crear una aplicación web secundaria (aplicaciones web anidadas) para poder reciclar la aplicación secundaria y no la principal. ¿Qué piensas sobre eso? Puede ser un poco más de trabajo, pero me da más flexibilidad, ¿no es así? – Mark