Unity IoC不会将dependency injectionWeb API Controller
我是使用Unity的新手,但我的问题是每当我调用我的Web服务时,我都会得到一个例外情况
“确保控制器具有无参数的公共构造函数”
我已经遵循了多个教程,但仍然遇到了同样的问题。
在我的WebApiConfig类的Register函数中,我有
var container = new UnityContainer(); container.RegisterType(new HierarchicalLifetimeManager()); config.DependencyResolver = new UnityResolver(container);
这是我的UnityResolver类
using Microsoft.Practices.Unity; using System; using System.Collections.Generic; using System.Web.Http.Dependencies; public class UnityResolver : IDependencyResolver { protected IUnityContainer container; public UnityResolver(IUnityContainer container) { if (container == null) { throw new ArgumentNullException("container"); } this.container = container; } public object GetService(Type serviceType) { try { return container.Resolve(serviceType); } catch (ResolutionFailedException) { return null; } } public IEnumerable GetServices(Type serviceType) { try { return container.ResolveAll(serviceType); } catch (ResolutionFailedException) { return new List(); } } public IDependencyScope BeginScope() { var child = container.CreateChildContainer(); return new UnityResolver(child); } public void Dispose() { container.Dispose(); } }
我没有注册任何控制器,因为每个教程都声称我不需要这样做。 这是我的实际控制器
public class Controller: ApiController { private IValidator _validator; public Controller(IValidator validator) { this._validator = validator; } [HttpPost] public void ReceiveIPN() { } }
有没有人对我做错了什么有任何想法? 谢谢!
编辑1:这是Validator类的“实现”。 这很空,因为在解决Unity问题之前我不想在这里引入一个bug。
using System; using System.Collections.Generic; using System.Linq; using System.Web; public class Validator: IValidator { public bool ValidateIPN(string body) { throw new NotImplementedException(); } }
编辑2:这是我尝试使用Fiddler调用web api路由时得到的整个错误响应
{“message”:“发生错误。”,“exceptionMessage”:“尝试创建’Controller’类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。”,“exceptionType”: System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)中的“System.InvalidOperationException”,“stackTrace”:“at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type controllerType)at at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()“,”innerException“:{”message“:”发生错误。“,”exceptionMessage“:”类型’Project.Controller’没有默认值构造函数“,”exceptionType“:”System.ArgumentException“,”stackTrace“:”在System.Web.Http.Internal.TypeActivator.Create [TBase]的System.Linq.Expressions.Expression.New(Type type)中(类型instanceType )在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceO System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type controllerType)中的rActivator(HttpRequestMessage请求,类型controllerType,Func`1和激活器)“}}
所以,经过几个小时的撞墙后,我发现这不起作用,因为我的项目中有一个OWIN / Katana Startup.cs课程。 现在我不知道到底发生了什么,所以更多信息会很棒。
基本上,由于我使用的是OWIN / Katana,我有一个Startup.cs文件创建了一个新的HttpConfiguration对象并对其进行了配置,类似于在WebApiConfig.cs类中完成的操作。
private void ConfigureWebApi(HttpConfiguration config) { config.MapHttpAttributeRoutes(); var container = new UnityContainer(); container.RegisterType(); config.DependencyResolver = new UnityDependencyResolver(container); var jsonFormatter = config.Formatters.OfType
看起来代码首先通过WebApiConfig的Register函数运行,然后THEN使用Startup.cs文件中生成的对象覆盖HttpConfiguration对象。 我不得不在这里移动我的容器设置,以使其工作。
对不起,我之前没有提起过OWIN的东西。 这对我来说是相当新的,我没有意识到它是相关的。 希望这可以为其他人节省我刚刚经历过的痛苦。
您的Unity容器可能已被丢弃,因为它仅在WebApiConfig.Register()
方法的范围内定义。 如果您将容器定义为Global的成员,这将使您的容器在应用程序的生命周期内保持不变,那么它应该可以正常工作。
编辑:也不要忘记在Application_End上处理容器。
我知道这是一个旧post,但由于我遇到了同样的问题,解决方案是简单地将配置对象传递给Unity注册函数并使用该实例中的DependencyResolver:
编辑:刚刚注意到接受的答案确实很明显…对不起垃圾邮件;-)
上述就是C#学习教程:Unity IoC不会将dependency injectionWeb API Controller分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
public static class UnityConfig { public static void Register(HttpConfiguration config) { var container = new UnityContainer(); // register your services here... // replace... /* GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); */ // with this: config.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031182.html