c# - multiple - Cómo hacer referencia al ensamblaje en mvc en tiempo de ejecución
mvc multiple submit buttons (3)
1) No recomendaría que sus vistas usen directamente referencias externas o referencias externas cargadas dinámicamente. Resuma esto haciendo que su vista interactúe con un controlador. Haga que su controlador alimente un objeto de datos a su vista que la aplicación conoce en tiempo de compilación (en otras palabras, un objeto conocido para su aplicación web en tiempo de compilación). Esto es para aislar completamente el negocio específico del complemento (abstracto) desde su punto de vista. Luego haz que tu controlador interactúe con el "complemento".
2) No sé cómo funciona su "fábrica personalizada", pero hoy en día ya no construimos ninguna "fábrica personalizada". En su lugar aprovechamos los contenedores de inyección de dependencia como Microsoft Unity (o Ninject, o Castle Windsor, etc.). La creación de "fábricas personalizadas" es muy anticuada y básicamente estás reinventando la rueda que se ha solucionado con la inyección de dependencia.
3) En cuanto a la carga dinámica de ensamblajes externos, no sé si lo tienes bien pero aquí hay un enlace:
Carga dinámicamente un tipo desde un ensamblaje externo
4) Por lo general, un diseño de complemento expone interfaces que son conocidas por su aplicación web principal en tiempo de compilación. Lo que oculta el diseño del complemento es la implementación, que puede cambiar de un complemento a otro. Lo importante es que cada complemento implementa las mismas interfaces públicas, las que espera su aplicación web principal. Normalmente, tendrá esas interfaces en un proyecto "Común" separado al que hacen referencia tanto su aplicación web principal como su complemento que implementa esas interfaces. Por lo tanto, desde su aplicación web principal, sabrá cuáles son las interfaces públicas de sus complementos, puede cargar dinámicamente el ensamblaje externo y usar la reflexión C # para encontrar las clases que implemente esas interfaces y cargarlas en su contenedor de inyección de dependencia. Del mismo modo, cualquiera que desee desarrollar un complemento para su aplicación web tendrá que implementar las interfaces definidas en su proyecto "Común".
Nota: "Común" es solo un nombre aleatorio que le di al proyecto. Puedes ponerle el nombre "PluginInterface" o lo que quieras.
Después de eso, tener el controlador agarrando lo que necesita del contenedor de inyección de dependencia es trivial.
Nota: Sus interfaces de plugins probablemente tendrán entidades de entrada y salida. Estas entidades se comparten entre su aplicación web principal y su complemento. En tal caso, dado que estas entidades son parte de sus interfaces, deben estar en el proyecto "Común". Puede sentirse tentado de que su controlador devuelva esas entidades directamente a su vista, pero entonces no tendrá una abstracción perfecta entre su vista y su complemento. No tener abstracciones perfectas es para otra discusión.
¡Espero eso ayude!
En mi aplicación Asp.Net MVC, tengo un archivo de vista ( .cshtml
) que hace referencia a una biblioteca externa que se cargará en tiempo de ejecución. así que después de que la aplicación comenzó, cargué el ensamblado mediante Assembly.Load y registré los controladores mediante mi ControllerFactory
personalizado y todo está bien.
Pero, en algunas vistas que tienen referencias al ensamblaje cargado dinámicamente, arroja el:
Mensaje de error del compilador: CS0234: el tipo o el nombre del espacio de nombres ''MyDynamicNamespace'' no existe en el espacio de nombres ''MyApp'' (¿falta una referencia de ensamblado?)
excepción que le dice al compilador razor no puede resolver el ensamblado relacionado.
Mi pregunta es, ¿hay alguna manera de registrar el ensamblaje en tiempo de ejecución, para que el compilador de navaja pueda acceder a él y resolverlo?
Tenga en cuenta que no puedo usar el método BuildManager.AddReferencedAssembly
porque mi ensamblaje debe cargarse después del inicio de la aplicación y BuildManager
no lo admite.
Aquí hay una nota que puede ayudar: si no está cargando sus ensamblajes desde el directorio /bin
, debe asegurarse de que la ruta a los ensambles sea reconocible:
AppDomain.CurrentDomain.AppendPrivatePath(path_to_your-dyna_assembly);
Como administrador de Sys, recomendaría un período de mantenimiento, especialmente si el archivo que reemplazas arruina algo más. Incluso si su período de mantenimiento es de solo media hora, es una buena práctica.
En cuanto a la DLL y la recompilación ... normalmente, el proceso de trabajo de IIS (el servicio que ejecuta su grupo de aplicaciones) se reciclará a intervalos regulares según la configuración de IIS y el uso de la memoria. Cuando esto sucede, la aplicación recompilará si algo requiere el JIT. También finaliza todas las sesiones de usuario abiertas a medida que se detiene físicamente y luego se reinicia. El proceso de trabajo también supervisa el directorio raíz (como usted mencionó) para cualquier cambio de archivo. Si se encuentra alguno, se forzará una recompilación. El hecho de que se cambie una dependencia no obliga a una recompilación. Si precompila su DLL, lo único que queda por compilar es cualquier código dentro de su archivo ASPX real y esto usa el JIT que compila cada vez. Según lo que describió, IIS no debería necesitar recompilar o reiniciar, suena como otro problema donde IIS se cuelga cuando intercambia el archivo. Puede ser necesario que un administrador de sistema participe para ver los registros de IIS.
¡Buena suerte!