Pregunta

Estoy usando monorail en mi aplicación web C#. Como lo actualicé (.NET Framework 2 a 4 y Monorail 1.0.3 a 2.1rc), no se encuentra mi clase de componente ViewComponente. Todos mis controladores parecen funcionar bien. Estoy usando el motor Nvelocity View. No estoy usando Windsor, pero ¿tal vez ahora se supone que lo registro de cierta manera?

En el archivo .vm, experimenté las siguientes líneas (sin éxito, la primera estaba funcionando antes de actualizar el proyecto):

 #component(MenuComponent)
 #component(MenuComponent with "role=admins")
 #blockcomponent(MenuComponent with "role=admins")

¿Alguien experimentó eso?

El mensaje de error completo es:

ViewComponent 'Menucomponent' no se pudo encontrar. ¿Estaba registrado? Si ha habilitado la integración de Windsor, entonces es probable que haya olvidado registrar el componente View como un componente Windsor. Si está seguro de que lo hizo, asegúrese de que el nombre utilizado sea la ID de componente o la clave pasada a ViewComponentDetailSattribute

¡Muchas gracias!

¿Fue útil?

Solución

Finalmente encontré una pista de mi problema. Utilicé el código fuente 'Castle.monorail.framework.dll' para ver lo que sucede dentro: parece que los ensambles especificados en el archivo web.config (en <Controllers> o incluso en <viewcomponents>) no se 'inspeccionan' como se supone que deben ser porque la variable que lo contiene se inicializa demasiado tarde.

Construí una nueva versión de la DLL y ahora está funcionando bien. Enviaré mi código 'fijo' a la comunidad del Proyecto Castle para asegurarme de que no es la consecuencia de otra cosa (como la mala configuración).

Hasta entonces aquí está mi 'solución', acabo de mover una parte del código. Puede encontrar el código fuente original aquí: http://www.symbolsource.org/public/metadata/default/project/castle/1.0-rc3/debug/all/castle.monorail.framework/castle.monorail.framework/services/defaultviewcomponentfactory.cs

*Assembly:* Castle.MonoRail.Framework
*Class:* Castle.MonoRail.Framework.Services.**DefaultViewComponentFactory**


public override void Service(IServiceProvider provider)
{
  /* Here is the section I moved */
  var config = (IMonoRailConfiguration)provider.GetService(typeof(IMonoRailConfiguration));
  if (config != null)
  {
    assemblies = config.ViewComponentsConfig.Assemblies;
    if (assemblies == null || assemblies.Length == 0)
    {
      // Convention: uses the controller assemblies in this case
      assemblies = config.ControllersConfig.Assemblies.ToArray();
    }
  }
  /*******************************/

  base.Service(provider); // Assemblies inspection is done there

  var loggerFactory = (ILoggerFactory) provider.GetService(typeof(ILoggerFactory));
  if (loggerFactory != null)
  {
    logger = loggerFactory.Create(typeof(DefaultViewComponentFactory));
  }
  /* The moved section was here */
}

Otros consejos

Tengo curiosidad, sin tu solución, si cambia el nombre de menucomponente para solo menú, ¿funciona?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top