我有一个(应该)看起来像这样的WebAPI控制器:
public class MyController : ApiController
{
private IRepository repository;
public MyController(IRepository repository)
{
this.repository = repositor;
}
// REST implementations
}WebApiConfig的配置如下:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Unity configuration
var container = new UnityContainer();
container
.RegisterType<IRepository , CustomRepository>();
config.DependencyResolver = new UnityResolver(container);
// Web API routes
// CORS
}
}然后在Global.asax.cs中,我有类似这样的东西:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
// CORS
protected void Application_BeginRequest(object sender, EventArgs e)
{
// some CORS config
}
}最后,我有了一个Startup.cs
[assembly: OwinStartup(typeof(Path.To.Startup))]
namespace ZeroCode.ConfigurazioneServizio.Web.Api
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
new Mapping().Bootstrap();
}
}
}对我来说,一切看起来都很好,代码构建好了,我可以启动控制器了,但是当我发出一个请求时,我得到了错误,因为无参数的构造器不存在。因此,我添加了默认构造函数,但这将实例化控制器,因此IRepository永远不会被注入。
我一直在寻找一个可能的解决方案。他们中的一个试图实现IHttpControllerActivator,所以我意识到了如下所示:
public class UnityHttpControllerActivator : IHttpControllerActivator
{
private IUnityContainer _container;
public UnityHttpControllerActivator(IUnityContainer container)
{
_container = container;
}
public IHttpController Create(System.Net.Http.HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
return (IHttpController)_container.Resolve(controllerType);
}
}现在,我已经修改了WebApiConfig.cs,插入了下面这一行
config.Services.Replace(typeof(IHttpControllerActivator), new UnityHttpControllerActivator(container));紧接在config.DependencyResolver之后,但这并不能解决问题,并且在Create方法中引发异常。我不知道我还能做什么。
发布于 2015-11-24 23:12:36
有一个很好的小Nuget包-- Unity.Webapi。如果你添加了它,你可以简单地把你的容器插入你的HttpConfiguration中
public static void Register(HttpConfiguration config)
{
// Unity configuration
var container = new UnityContainer();
container.RegisterType<IRepository , CustomRepository>();
config.DependencyResolver = new UnityResolver(container);
//this
config.DependencyResolver = new UnityDependencyResolver(container);
// Web API routes
// CORS
}然后,您可以绕过额外的类和web.config更改。
发布于 2017-11-01 18:07:05
第一个答案说明要添加Unity.WebApi。这是正确的。添加此包后,请按照此链接Using Unity.Mvc5 and Unity.WebApi together in a project中的说明使用它。我喜欢这样,我的问题就解决了。
发布于 2019-02-07 08:32:17
对于unity版本5或更高版本,您必须添加Unity.AspNet.WebApi NuGet包。然后,您可以简单地按照NuGet包中的说明注册您的类型并注册依赖关系解析器,如下所示:
using Unity.AspNet.WebApi;
config.DependencyResolver = new UnityDependencyResolver(container);https://stackoverflow.com/questions/33897049
复制相似问题