使用Unity在WebAPI中注入依赖项
本文关键字:注入 依赖 WebAPI Unity 使用 | 更新日期: 2023-09-27 18:24:19
我有一个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
方法内部引发了异常。我不知道还能做什么。
有一个不错的小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更改。
第一个答案表示添加Unity.WebApi。这是正确的。添加此包后,请按照本链接中的说明在项目中使用Unity.Mvc5和Unity.WebApi。我确实喜欢这样,我的问题解决了。
对于unity版本5或更高版本,您必须添加unity.AspNet.WebApiNuGet包。然后,您可以简单地按照NuGet包中的说明注册您的类型并注册您的依赖关系解析器,如下所示:
using Unity.AspNet.WebApi;
config.DependencyResolver = new UnityDependencyResolver(container);
NuGet包链接:https://github.com/unitycontainer/aspnet-webapi
您需要将Unity设置为WebAPI的依赖解析程序。
将以下NuGet包添加到您的项目中:https://www.nuget.org/packages/Unity.WebAPI/
然后将WebAPI配置为使用正确的解析器,将以下内容添加到WebApiConfig.cs 中
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
这是3步过程:
- 寄存器
- 解决
- 将解析器链接到
GlobalConfiguration
您似乎没有添加解析代码,上述解决方案也没有。
在将DependencyResolver
附加到GlobalConfiguration
之前添加此行。
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
我也遇到了同样的问题。对我来说,这个确切错误的解决方案是,所有其他控制器构造函数也在请求时加载。其中一个在构造函数中没有有效的参数。它没有在Unity注册。
所以我从Unity那里得到了失败的决议。
但在修复了另一个控制器后,一切都正常了。