将Monorail从v1.0.3升级到v2.1RC后找不到ViewComponent



我在C#web应用程序中使用Monorail。由于我升级了它(.Net Framework 2到4,Monorail 1.0.3到2.1RC),所以找不到我的ViewComponent类。我所有的控制器似乎都工作得很好。我正在使用nVelocityView引擎。我没有使用温莎,但也许现在我应该以某种方式注册它?

在.vm文件中,我尝试了以下几行(没有成功,第一行在我升级项目之前就已经工作了):

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

有人做过实验吗?

完整的错误消息是:

ViewComponent"MenuComponent"无法找不到。它注册了吗?如果您启用了Windsor Integration,那么很可能你已经忘记了将视图组件注册为温莎组件。如果你确信做到了,然后确保使用了名称是传递的组件id还是密钥查看ComponentDetailsAttribute

非常感谢!

我终于找到了解决问题的线索。我使用了"Castle.Monorail.Framework.dll"源代码来查看内部发生了什么:在Web.Config文件(在<Controllers>中,甚至在<viewcomponents>中)中指定的程序集似乎没有按照预期进行"检查",因为包含它的变量初始化得太晚了。

我构建了一个新版本的dll,现在它运行良好。我将把我的"固定"代码提交给城堡项目社区,以确保它不是其他事情的结果(比如糟糕的设置)。

直到这里是我的"修复",我只是移动了一部分代码。您可以在此处找到原始源代码: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 */
}

我很好奇,如果没有你的修复,如果你将MenuComponent重命名为Menu,它能工作吗?

相关内容

  • 没有找到相关文章

最新更新