C#学习教程:ASPWebApi-IoC-解析HttpRequestMessage我也在使用Hyprlinkr包(https://github.com/ploeh/Hyprlinkr),因此需要将HttpRequestMessage的一个实例注入到我的控制器的一个依赖项中。我正在关注MarkSeemann的这篇文章-http://blog.ploeh.dk/2012/04/19/WiringHttpControllerContextWithCastleWindsor.aspx,但我发现尽管API正在运行,但当我调用它时,请求只是挂起。没有错误消息。这就像它在一个无限循环中。它卡在我的CustomControllerActivator调用Resolve我认为我的一些城堡注册错误。如果我删除上面文章中提到的那些,那么我可以成功调用API(尽管没有我需要解决的依赖项)有什么想法吗?代码如下//Global.asaxpublicclassWebApiApplication:HttpApplication{publicWebApiApplication(){container=newWindsorContainer(newDefaultKernel(newInlineDependenciesPropagatingDependencyResolver(),newDefaultProxyFactory()),newDefaultComponentInstaller());容器。安装(新的DependencyInstaller());}protectedvoidApplication_Start(){GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator),newWindsorCompositionRoot(this.container));}//安装程序publicclassDependencyInstaller:IWindsorubInstallerid{(IWindsorContainercontainer,IConfigurationStorestore){container.AddFacility();container.Register(Component.For().Named("ValuesController").LifeStyle.PerWebRequest,Component.For().ImplementedBy().LifeStyle.PerWebRequest,Component.For().ImplementedBy().LifeStyle.PerWebRequest,Component.For().Named("HttpRequestMessage").LifeStyle.PerWebRequest);}}//激活器publicclassWindsorCompositionRoot:IHttpControllerActivator{privatereadonlyIWindsorContainercontainer;publicWindsorCompositionRoot(IWindsorContainercontainer){this.container=container;}publicIHttpControllerCreate(HttpRequestMessagerequest,HttpControllerDescriptorcontrollerDescriptor,TypecontrollerType){varcontroller=(IHttpController)this.container.Resolve(controllerType,new{request=request});request.RegisterForDispose(newRelease(()=>this.container.Release(controller)));返回控制器;}//DependencyResolver公共类InlineDependenciesPropagatingDependencyResolver:DefaultDependencyResolver{protectedoverrideCreationContextRebuildContextForParameter(CreationContextcurrent,TypeparameterType){if(parameterType.ContainsGenericParameters){}返回新的CreationContext(参数Type,当前,真实);}}EDIT*************Additionalinfo****************所以我设置了一个场景,控制器只需要将HttpRequestMessage作为ctor参数,然后找到:这个有效://controllerpublicclassValuesController:ApiController{privatereadonlyHttpRequestMessage_httpReq;publicValuesController(HttpRequestMessagehttpReq){_httpReq=httpReq;}//IHttpControllerActivatorpublicIHttpControllerCreate(HttpRequestMessagehttpRequest,HttpControllerDescriptorcontrollerDescriptor,TypecontrollerType){varcontroller=(IHttpController)this.container.Resolve(controllerType,new{httpReq=httpRequest});}返回控制器;然而,这并不//控制器publicclassValuesController:ApiController{privatereadonlyHttpRequestMessage_httpReq;公共ValuesController(HttpRequestMessage请求){_httpReq=请求;}//IHttpControllerActivatorpublicIHttpControllerCreate(HttpRequestMessagerequest,HttpControllerDescriptorcontrollerDescriptor,TypecontrollerType){varcontroller=(IHttpController)this.container.Resolve(controllerType,new{request=request});返回控制器;即当anon对象有一个名为“request”的属性并且控制器ctorarg被称为“request”时。它以某种方式使控制器认为其请求属性为空。这就是导致我看到的错误的原因:无法重用“ApiController”实例。每个传入消息都必须构造“ApiController”。检查您的自定义“IHttpControllerActivator”并确保它不会生成相同的实例。System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage)上System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage请求,CancellationTokencancellationToken)的System.Web.Http.ApiController.ExecuteAsync(HttpControllerContextcontrollerTokenTokenContext,Cancellation)在System.Web.Http.ApiController.ExecuteAsync(HttpControllerContextcontrollerContext,CancellationTokencancellationToken)request,cancelvoicecancelstatement)阅读这篇HowtoenrichthecompositionofobjectsinStructureMapwithoutcallingsetterinjection?它解释了类似的情况。当然,hyprlinkr有一个名为“request”的HttpRequestMessage构造函数参数,因此我确实需要使用该属性名称指定匿名对象。有什么想法吗?这是一个适合我的组合根:publicclassWindsorCompositionRoot:IHttpControllerActivator{publicWindsorCompositionRoot(IWindsorContainercontainer){this.container=container;}publicIHttpControllerCreate(HttpRequestMessagerequest,HttpControllerDescriptorcontrollerDescriptor,TypecontrollerType){varcontroller=(IHttpController)this.container.Resolve(controllerType,new{request=request});request.RegisterForDispose(newRelease(()=>this.container.Release(controller)));返回控制器;}privateclassRelease:IDisposable{privatereadonlyActionrelease;公开发布(行动发布){this.release=release;}publicvoidDispose(){this.release();这是我创建容器的方式:this.container=newWindsorContainer(newDefaultKernel(newInlineDependenciesPropagatingDependencyResolver(),newDefaultProxyFactory()),newDefaultComponentInstaller()).Install(newMyWindsorInst艾尔());这是InlineDependenciesPropagatingDependencyResolver:}returnnewCreationContext(parameterType,current,true);最后,这是我注册RouteLinker的方式:container.Register(Component.For().LifestyleTransient());需要注意的一件事是,ApiController基类有一个名为Request的HttpRequestMessage类型的公共属性,如我的书中所述,如第10.4.3节所述,Windsor将尝试为每个可写属性分配一个值,如果它有一个匹配的组件-并且该匹配不区分大小写。这正是您将HttpRequestMessage命名请求传递给Resolve方法时发生的情况,因此您需要告诉CastleWindsor它应该删除ApiController的属性注入。以下是我在基于会话的注册中的表达方式:为什么不在ASP.NETWebAPI中使用已经内置的机制-DependencyResolverhttp://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver在项目WebApiContrib中有CastleWindsor解析器实现,但正如我在依赖解析器中看到的那样https://github.com/WebApiContrib/WebApiContrib.IoC.CastleWindsor正如Mark在评论中所说-实现IHttpControllerActivator的方法之一http://blog.ploeh.dk/2012/10/03/DependencyInjectionInASPNETWebAPIWithCastleWindsor.aspx以上是C#学习教程:ASPWebApi–IoC–解析HttpRequestMessage分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
