Asp.net Mvc中MVCContrib中无法使用Castle的发解决方案

在使用Asp.net Mvc MVCContrib 0.0.1.91中的Castle时会出现No component for key Home was found这样的错误

错误解决方法如下:

下载MvcContrib源代码,更改MvcContrib.Castle的WindsorControllerFactory.cs中的34行CreateController方法为:

 

            public IController CreateController(RequestContext context, string controllerName)
            {
                        controllerName = controllerName +
"Controller"; //更改了这里

                    IWindsorContainer container = GetContainer(context);
                   
return (IController)container.Resolve(controllerName);
            }

这个更改方法可能仅限于MVCContrib 0.0.1.91

posted @ 2008-04-01 13:29 重典 阅读(1571) 评论(6) 编辑 收藏

 回复 引用 查看   
#1楼2008-04-14 00:49 | 小No      
我也发现这个问题了,最新版还是没有修改过来!!
 回复 引用 查看   
#2楼[楼主]2008-04-14 10:21 | 重典      
@小No
是啊,这个更新速度很快,但问题也不少

 回复 引用 查看   
#3楼2008-04-14 23:49 | 小No      
但是改了这个之后MvcContrib.Samples.NVelocityViewFactory这个例子可以运行了,但是新的问题出来了
MvcContrib.Samples.WindsorControllerFactory这个例子却不能运行了

错误是:
No component for key HomeController was found

奇怪的是改回到最初的代码这个例子可以了, 第一个又不行了, 真的不知道改怎么改

 回复 引用 查看   
#4楼2008-04-15 00:23 | 小No      

我找到问题所在了

原来在MvcContrib.Castle的WindsorExtensions.cs的16行有个RegisterControllers方法:

public static IWindsorContainer RegisterControllers(this IWindsorContainer container, params Type[] controllerTypes)
  {
   foreach(Type type in controllerTypes)
   {
    if(MvcContrib.ControllerFactories.DefaultControllerFactory.IsController(type))
    {
     container.AddComponentWithLifestyle(type.Name.ToLower(), type, LifestyleType.Transient);
    }
   }

   return container;
  }
如果要修改源代码的话,这个方法的ToLower()也必须去掉。

其实最简单解决方案就是不用修改MvcContrib.Castle的源代码,在添加组件的时候,key必须转换成小写,就像这句代码:
container.AddComponentWithLifestyle(type.Name.ToLower(), type, LifestyleType.Transient); 一样用法就可以了


 回复 引用 查看   
#5楼[楼主]2008-04-25 12:22 | 重典      
@小No
果然是这里也有问题,呵呵,还是兄弟你认真啊