UnityIoC不会共享依赖注入WebAPI控制器异常“确保控制器有一个没有参数的公共构造函数”我已经学习了多个教程,但仍然遇到同样的问题。在我的WebApiConfig类的注册函数中,我有varcontainer=newUnityContainer();container.RegisterType(newHierarchicalLifetimeManager());config.DependencyResolver=newUnityResolver(容器);这是我使用Microsoft.Practices.Unity的UnityResolver类;使用系统;使用System.Collections.Generic;使用System.Web.Http.Dependencies;公共类UnityResolver:IDependencyResolver{protectedIUnityContainer容器;publicUnityResolver(IUnityContainercontainer){if(container==null){thrownewArgumentNullException("container");}这个容器=容器;}publicobjectGetService(TypeserviceType){try{returncontainer.Resolve(serviceType);}catch(ResolutionFailedException){返回null;}}publicIEnumerableGetServices(TypeserviceType){try{returncontainer.ResolveAll(serviceType);}catch(ResolutionFailedException){returnnewList();}}publicIDependencyScopeBeginScope(){varchild=container.CreateChildContainer();关于转新的UnityResolver(孩子);}publicvoidDispose(){container.Dispose();我没有注册任何控制器,因为每个教程都声称我不需要这样做这是我的实际控制器publicclassController:ApiController{privateIValidator_validator;公共控制器(IValidator验证器){this._validator=validator;}[HttpPost]publicvoidReceiveIPN(){}}有没有人知道我做错了什么?谢谢!编辑1:这是Validator类的“实现”。这是相当空洞的,因为在Unity问题得到解决之前我不想在这里引入错误。使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Web;publicclassValidator:IValidator{publicboolValidateIPN(stringbody){thrownewNotImplementedException();编辑2:这就是我尝试使用的Fiddler在调用WebAPI路由时得到的整个错误响应{"message":"Anerroroccurred.","exceptionMessage":"Anerroroccurredwhiletryingtocreatea“Controller”类型的控制器。确保控制器有一个没有参数的公共构造函数。”,“exceptionType”:System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage请求)中的“System.InvalidOperationException”,“stackTrace”:“atSystem.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptorcontrollerDescriptor,TypecontrollerType)atatatSystem.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()“,”innerException“:{”message“:”发生错误。","exceptionMessage":"Type'Project.Controller'没有默认值构造函数","exceptionType":"System.ArgumentException","stackTrace":"atSystem.Web.Http.Internal.TypeActivator.Create[TBase]System.Linq.Expressions.Expression.New(类型类型)(类型实例类型)在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOSystem.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor,类型controllerDescriptorrActivator(HttpRequestMessage请求,在controllerType)中键入controllerType、Func`1和activator)"}}所以,在翻墙几个小时后,我发现这不起作用,因为我的项目.cs类中有一个OWIN/KatanaStartup.现在我不知道到底发生了什么,所以更多信息会很好。基本上,因为我使用的是OWIN/Katana,所以我有一个Startup.cs文件,它创建一个新的HttpConfiguration对象并将其更新为Configured,类似在WebApiConfig.cs类中完成的工作。privatevoidConfigureWebApi(HttpConfigurationconfig){config.MapHttpAttributeRoutes();varcontainer=newUnityContainer();容器.RegisterType();config.DependencyResolver=newUnityDependencyResolver(容器);varjsonFormatter=config.Formatterscode.OfType看起来首先运行WebApiConfig的Register函数,然后用Startup.cs文件中生成的对象覆盖HttpConfiguration对象。我必须将容器设置移至此处才能使其正常工作。对不起,我之前没有提到OWIN的东西。这对我来说是相当新的,我没有意识到它是相关的。希望这可以帮助其他人避免我刚刚经历的痛苦。您的Unity容器可能已被丢弃,因为它仅在WebApiConfig.Register()方法的范围内定义。如果您将容器定义为Global的成员,这将使您的容器在应用程序的生命周期内持久存在,那么它应该可以正常工作。编辑:也不要忘记在Application_End上处理容器。我知道这是一篇旧文章,但由于我遇到了同样的问题,解决方案是简单地将配置对象传递给Unity注册函数并使用该实例中的DependencyResolver:编辑:只是注意到接受的答案确实很明显...抱歉垃圾邮件;-)以上是C#学习教程:UnityIoC不会分享依赖注入WebAPIController的所有内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注---publicstaticclassUnityConfig{publicstaticvoidRegister(HttpConfigurationconfig){varcontainer=newUnityContainer();//在这里注册你的服务...//替换.../*GlobalConfiguration.Configuration.DependencyResolver=newUnity.WebApi.UnityDependencyResolver(container);*///用这个:config.DependencyResolver=newUnity.WebApi.UnityDependencyResolver(container);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
