为什么Castle Windsor试图将我的“内容”和“脚本”文件夹解析为控制器?

我创建了一个ASP.NET MVC应用程序,并尝试使用Castle Windsor作为我的IOC

但是,当控制器试图解决时,我将’Content’和’Scripts’放入CreateController(RequestContext requestContext, string controllerName)方法中的’controllerName’参数中。 不用说这些不是控制器。 它们似乎是网站的文件夹

为什么要尝试将这些注册为控制器?

我该如何忽略这些文件夹?

谢谢

来自WindsorControllerFactory的exception

由于无法发布图像我必须描述它 – 它基本上只是说

‘找不到内容控制器’

的Global.asax.cs

 public static IIocContainer Ioc; protected void Application_Start() { InitialiseIocContainer(); RegisterViewEngine(ViewEngines.Engines); RegisterRoutes(RouteTable.Routes); StartProfiling(); } private void InitialiseIocContainer() { IWindsorContainer _container = new WindsorContainer(); var controllerTypes = typeof (GidgetController).Assembly.GetTypes(); foreach (var controllerType in controllerTypes.Where((t=>typeof(IController).IsAssignableFrom(t)))) { _container.AddComponentLifeStyle(controllerType.Name.ToLower(), controllerType, LifestyleType.Transient); } _container.AddComponent("a",typeof(IGidgetService), typeof(GidgetService)); _container.AddComponent("b",typeof(IGidgetRepository), typeof(GidgetRepository)); _container.AddComponent("c",typeof(IGidgetValidator), typeof(GidgetValidator)); ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(_container)); } 

windsorControllerFactory.cs

 public IController CreateController(RequestContext requestContext, string controllerName) { try { controllerName = controllerName.ToLower() + "controller"; var controller = _container.Resolve(controllerName); return controller; } catch (ComponentNotFoundException) { throw new HttpException(404, string.Format("The {0} controller was not found", controllerName)); } } 

只需使用MVCContrib 。

它包括集成Windsor和ASP.NET MVC的所有内容,包括控制器工厂和注册控制器的扩展 。

我按照Steve Sanderson的模式创建了一个WindsorControllerFactory,效果很好。 当名字没有控制器时(即有人输入“/ garbageblahblah”),我已经修改了他以实际返回正确的404s,因为他的模式没有拿起它。 因此,我使用Reflector来获取内置于默认控制器工厂中的位以处理错误的URL。

他的模式使用reflection来查找Mvc项目中的所有控制器,并在应用启动时注册它们。 您不希望使用CreateController,而是使用GetControllerInstance(),因为只有在调用控制器时,底层Mvc框架才会调用它。 / Content被约定忽略,因此不会被调用。

我的CastleWindsorControllerFactory:

 ///  /// Represents a special controller factory. ///  public class CastleWindsorControllerFactory : DefaultControllerFactory { WindsorContainer _container; public CastleWindsorControllerFactory() { // register all controllers from the calling assembly. // (eg the mvc site calling this factory) // _container = new WindsorContainer( new XmlInterpreter( new ConfigResource("castle") ) ); // change this to Assembly.GetAssembly() if used directly from // your MVC website. The code below is for when this class // exists in a seperate assembly. // var controllers = from t in Assembly.GetCallingAssembly().GetTypes() where typeof(IController).IsAssignableFrom(t) select t; foreach (Type t in controllers) _container.AddComponentLifeStyle( t.FullName, t, LifestyleType.Transient); } protected override IController GetControllerInstance(Type controllerType) { if (controllerType == null) { throw new HttpException( 0x194 , string.Format( CultureInfo.CurrentUICulture , "Controller Not Found" , new object[] { this.RequestContext.HttpContext.Request.Path })); } if (false == typeof(IController).IsAssignableFrom(controllerType)) { throw new ArgumentException( string.Format( CultureInfo.CurrentUICulture , "Type does not sub-class the controller base" , new object[] { controllerType }), "controllerType"); } return (IController) _container.Resolve(controllerType); } } 

在我的Globals.asax.cs中,这就是你所需要的(你上面所拥有的是大量的过度杀伤!我已经在上面的CastleWindsorControllerFactor中循环并注册它们)。

 protected void Application_Start() { RegisterRoutes(RouteTable.Routes); // custom controller factory that uses Windsor ControllerBuilder.Current.SetControllerFactory( new CastleWindsorControllerFactory()); // Uncomment to debug routes //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); } 

从技术上讲,这不完全是我使用的代码。 我实际上将整个Castle Windsor抽象为一个静态实例,我在这个类中调用了ComponentFactory。 这允许我通过我的应用程序获得真正的单例模式,在几个强类型的添加中。

我提到这个,因为我打算很快在我的博客上发布ComponentFactory()。 但是,给我发电子邮件,我会发送最新版本给你。 电子邮件是:me -at- eduncan911.com