我在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,它能工作吗?