2011-06-16 3 views
3

J'utilise Monorail dans mon application Web C#. Depuis que je l'ai mis à jour (.Net Framework 2 à 4 et Monorail 1.0.3 à 2.1RC), ma classe ViewComponent est introuvable. Tous mes contrôleurs semblent fonctionner correctement. J'utilise nVelocity View Engine. Je n'utilise pas Windsor, mais peut-être que je suis censé l'enregistrer d'une certaine façon?ViewComponent introuvable après la mise à niveau de Monorail de la version 1.0.3 vers la version v2.1RC

Dans le fichier .vm, j'ai expérimenté les lignes suivantes (sans succès, le premier fonctionnait avant le projet que je mis à jour):

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

Quelqu'un at-il expérience qui?

Le message d'erreur complet est:

ViewComponent 'MenuComponent' pourrait pas être trouvé. A-t-il été enregistré? Si vous avez activé Intégration Windsor, alors il est probable que vous ayez oublié pour enregistrer le composant de vue en tant que composant Windsor . Si vous êtes sûr que vous l'avez fait , alors assurez-vous que le nom utilisé est l'ID de composant ou la clé passée à ViewComponentDetailsAttribute

Un grand merci!

+0

Comment l'enregistrez-vous à Windsor? – jishi

+0

Désolé jishi, je n'utilise pas Windsor alors je ne peux pas vous aider. Peut-être que vous pouvez trouver un indice dans cet exemple de code: http://groups.google.com/group/castle-project-users/browse_thread/thread/f8002e922dc04bee –

+0

Alors comment enregistrer les composants et les contrôleurs? Je ne demandais pas pour moi, je demandais pour vous aider. – jishi

Répondre

1

J'ai finalement trouvé un indice à mon problème. J'ai utilisé le code source 'Castle.Monorail.Framework.dll' pour voir ce qui se passe à l'intérieur: il semble que les assemblys spécifiés dans le fichier Web.Config (dans <Controllers> ou même dans <viewcomponents>) ne sont pas 'inspectés' comme ils sont censés l'être parce que la variable qui le contient est initialisée trop tard.

J'ai construit une nouvelle version de la DLL et maintenant ça fonctionne bien. Je soumettrai mon code "fixe" à la communauté Castle Project pour être sûr que ce n'est pas la conséquence de quelque chose d'autre (comme les mauvais réglages).

Alors, voici ma 'solution', je viens de déplacer une partie du code. Vous pouvez trouver le code source original ici: 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 */ 
} 
0

Je suis curieux, sans votre solution, si vous renommez MenuComponent juste Menu, ça marche?

Questions connexes