CastleWindsorApiControllerFactory实现ASP.NETWebAPI我知道可以使用DependancyResolver并将CastleWindsor注册到MVC但是由于https://stackoverflow.com/a/4889222/139392中描述的问题,我们在MVC项目上卡在WindsorControllerFactory实现方法上。但是,看起来ApiControllers使用的是不同类型的工厂,因为CastleWindsor无法注入依赖项。有没有人想出如何在不使用DependencyResolver的情况下将CastleWindsor与ASP.NETWebAPI和MVC一起使用?感谢Critiano的帖子和一些在线搜索,我设法让它在这里工作是任何其他有这个问题的代码。我习惯了MVC3和ASP.NETWebApiBeta,但我认为同样的解决方案应该适用于MVC4。首先,我创建了一个WindsorHttpControllerFactory,因为ApiControllers使用与MVC不同的工厂。公共类WindsorHttpControllerFactory:IHttpControllerFactory{privatereadonlyIKernel内核;私有只读HttpConfiguration配置;publicWindsorHttpControllerFactory(IKernel内核,HttpConfiguration配置){this.kernel=kernel;this.configuration=配置;}publicIHttpControllerCreateController(HttpControllerContextcontrollerContext,stringcontrollerName){if(controllerName==null){thrownewHttpException(404,string.Format("找不到路径'{0}'的控制器。",controllerContext.Request.RequestUri.AbsolutePath));}varcontroller=kernel.Resolve(controllerName);controllerContext.Controller=控制器;controllerContext.ControllerDescriptor=newHttpControllerDescriptor(configuration,controllerName,controller.GetType());返回controllerContext.Controller;}publicvoidReleaseController(IHttpControllercontroller){kernel.ReleaseComponent(controller);}}棘手的部分是注册表它似是浸及注册表一一大堆其他的东西,这就是我最终得到的。container.Register(Component.For().ImplementedBy().LifeStyle.Singleton);container.Register(Component.For().ImplementedBy().LifeStyle.Singleton);container.Register(Component.For().ImplementedBy().LifeStyle.Singleton);container.Register(Component.For().ImplementedBy().LifeStyle.Transient);container.Register(Component.For().ImplementedBy().LifeStyle.Transient);container.Register(Component.For().ImplementedBy().LifeStyle.Transient);container.Register(Component.For().ImplementedBy().LifeStyle.Transient);container.Register(Component.For().ImplementedBy().LifeStyle.Transient);container.Register(Component.For().Instance(配置));//注册所有的api控制器.LifeStyle.Transient));//向服务解析器GlobalConfig注册WindsorHttpControllerFactoryduration.Configuration.ServiceResolver.SetService(typeof(IHttpControllerFactory),container.Resolve());我必须创建自己的ILogger实现,您可以使用像下面这样的存根版本在这里,例如。你可以使用log4net}publicvoidLog(stringcategory,TraceLevellevel,FuncmessageCallback){//在这里做一些日志记录,例如。你可以使用log4net}}两天前我也遇到了这个问题,这篇文章帮助了我。并且不要忘记在Windsor引导程序中添加WebAPI控制器。container.Register(AllTypes.FromThisAssembly().BasedOn().LifestyleTransient());ASP.NETMVC4RC更新:这篇有用的帖子告诉您如何将Windsor与WebAPI结合使用,它的效果非常好。查看这篇文章我没有切换到包括web.api在内的mvc4beta(我仍在使用WCFwebapiPrev6),但是线程中已经指出的方式似乎正在运行我写了一篇关于如何做的文章这篇文章,并将其连接到RavenDB,您可能会发现这里很有用温莎代码示例privatevoidBootStrapWindsorContainer(){_container=newWindsorContainer().Install(FromAssembly.This());varcontrollerFactory=newWindsorControllerFactory(_container.Kernel);ControllerBuilder.Current.SetControllerFactory(controllerFactory);)=>newWindsorServiceLocator(_container));GlobalConfiguration.Configuration.ServiceResolver.SetResolver(t=>{try{return_container.Resolve(t);}catch{returnnull;}},t=>{try{return_container.ResolveAll(t).OfType();}赶上{返回新列表();}});无法解析类型时返回null,似乎MVC将产生新的依赖项。编辑:确保您有IHttpController的安装程序。以上就是C#学习教程:CastleWindsorApiController工厂实现ASP.NETWebAPI分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——publicclassWindsorHttpControllerFactory:IHttpControllerActivator{readonlyIWindsorContainer_container;公共WindsorHttpControllerFactory(IWindsorContainer容器){_container=容器;}publicIHttpControllerCreate(HttpRequestMessagerequest,HttpControllerDescriptorcontrollerDescriptor,TypecontrollerType){varcontroller=(IHttpController)_container.Resolve(controllerType);request.RegisterForDispose(newRelease(()=>_container.Release(controller)));返回控制器;}classRelease:IDisposable{readonlyAction_release;公开发布(行动发布){_release=release;}publicvoidDispose(){_release();}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
