为什么CastleWindsor试图将我的“content”和“scripts”文件夹解析为控制器?我创建了一个ASP.NETMVC应用程序并尝试使用CastleWindsor作为我的IOC但是,当控制器尝试解析时,我将“Content”和“Scripts”放入“controllerName”中的CreateController(RequestContextrequestContext,stringcontrollerName)方法中'范围。不用说,这些不是控制器。它们似乎是网站的文件夹,您为什么要将它们注册为控制器?我怎样才能忽略这些文件夹?感谢WindsorControllerFactory的异常,因为我无法发布我必须描述它的图像-它基本上只是说“找不到内容控制器”Global.asax.cspublicstaticIIocContainerIoc;protectedvoidApplication_Start(){InitialiseIocContainer();RegisterViewEngine(ViewEngines.Engines);RegisterRoutes(RouteTable.Routes);开始分析();}privatevoidInitialiseIocContainer(){IWindsorContainer_container=newWindsorContainer();varcontrollerTypes=typeof(GidgetController).Assembly.GetTypes();foreach(varcontrollerTypeincontrollerTypes.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(newWindsorControllerFactory(_container));}windsorControllerFactory.cspublicIControllerCreateController(RequestContextrequestContext,stringcontrollerName){try{controllerName=controllerName.ToLower()+"controller";var_controller=.Resolve(控制器名称);返回控制器;}catch(ComponentNotFoundException){thrownewHttpException(404,string.Format("The{0}controllerwasnotfound",controllerName));只需使用MVCContrib,它包括与Windsor和所有ASP.NETMVC的集成,包括控制器工厂和注册控制器的扩展。我按照SteveSanderson的模式创建了一个WindsorControllerFactory,它运行良好。我已经修改了他,以便在名称没有控制器时(即有人键入“/garbageblahblah”)实际返回正确的404,因为他的模式没有接受它。因此,我使用Reflector将位内置到默认控制器工厂中以处理错误的URL。他的模式使用反射来查找Mvc项目中的所有控制器并在应用程序启动时注册它们。你不想用CreateController,而是GetControllerInstance(),因为底层的Mvc框架只会在controller被调用的时候调用它。/Content被约定忽略,所以它不会被调用。我的CastleWindsorControllerFactory://////代表一个特殊的控制器工厂。///公共类CastleWindsorControllerFactory:DefaultControllerFactory{WindsorContainer_container;publicCastleWindsorControllerFactory(){//从调用程序集中注册所有控制器。//(例如调用此工厂的mvc站点)//_container=newWindsorContainer(newXmlInterpreter(newConfigResource("castle")));//如果直接从您的MVC网站使用,请将其更改为Assembly.GetAssembly()。下面的代码适用于此类//存在于单独的程序集中的情况。//varcontrollers=fromtinAssembly.GetCallingAssembly().GetTypes()wheretypeof(IController).IsAssignableFrom(t)selectt;foreach(在控制器中输入t)_container.AddComponentLifeStyle(t.FullName,t,LifestyleType.Transient);}protectedoverrideIControllerGetControllerInstance(TypecontrollerType){if(controllerType==null){thrownewHttpException(0x194,string.Format(CultureInfo.CurrentUICulture,"找不到控制器",newobject[]{this.RequestContext.HttpContext.Request.Path}));}if(false==typeof(IController).IsAssignableFrom(controllerType)){thrownewArgumentException(string.Format(CultureInfo.CurrentUICulture,"Typedoesnotsub-classthecontrollerbase",newobject[]{controllerType}),“控制器类型”);}返回(IController)_container.Resolve(controllerType);在我的Globals.asax.cs中,这就是您所需要的(上面的内容太过分了!我已经遍历了上面的CastleWindsorControllerFactor并注册了它们)//使用WindsorControllerBuilder.Current.SetControllerFactory(newCastleWindsorControllerFactory())的自定义控制器工厂;//取消注释以调试路由//RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);从技术上讲,这不完全是我使用的代码。我其实是把整个温莎城堡抽象成了一个静态实例,在这个类中调用了ComponentFactory。这使我能够在我的应用程序中通过几个强类型添加获得真正的单例模式。我提到这个是因为我计划很快在我的博客上发布ComponentFactory()。但是,请给我发电子邮件,我会向您发送最新版本。邮箱是:me-at-eduncan911.com以上是C#学习教程:WhyisCastleWindsortryingtoresolvemy"content"and"scripts"foldersascontrollers?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
