ViewComponent не найден после обновления Monorail с v1.0.3 до v2.1RC
Я использую монорельс в моем веб-приложении C#. Поскольку я обновил его (.Net Framework 2 до 4 и Monorail 1.0.3 до 2.1RC), мой класс ViewComponent не найден. Все мои контроллеры работают нормально. Я использую nVelocity View Engine. Я не использую Виндзор, но, может быть, теперь я полагаю, чтобы зарегистрировать его определенным образом?
В файле.vm я экспериментировал со следующими строками (без успеха первая работала до того, как обновил проект):
#component(MenuComponent)
#component(MenuComponent with "role=admins")
#blockcomponent(MenuComponent with "role=admins")
Кто-нибудь экспериментировал с этим?
Полное сообщение об ошибке:
ViewComponent 'MenuComponent' не может быть найден. Это было зарегистрировано? Если вы включили Windsor Integration, то, скорее всего, вы забыли зарегистрировать компонент представления как компонент Windsor. Если вы уверены, что сделали это, убедитесь, что используемое имя является идентификатором компонента или ключом, переданным ViewComponentDetailsAttribute.
Большое спасибо!
2 ответа
Я наконец нашел ключ к моей проблеме. Я использовал исходный код 'Castle.Monorail.Framework.dll', чтобы увидеть, что происходит внутри: кажется, что сборки указаны в файле Web.Config (в <Controllers>
или даже в <viewcomponents>
) не "проверяются", как это должно быть, потому что переменная, которая их содержит, инициализируется слишком поздно.
Я собрал новую версию dll и теперь она работает нормально. Я отправлю свой "исправленный" код сообществу Castle Project, чтобы убедиться, что он не является следствием чего-то другого (например, плохих настроек).
Пока вот мое "исправление", я только что переместил часть кода. Вы можете найти оригинальный исходный код здесь: 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, это работает?