[英]Inject dependencies in a WebAPI with Unity
我有一个(应该)如下所示的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来使用它。 我确实喜欢这样,我的问题就解决了。
对于版本5或更高版本,您必须添加Unity.AspNet.WebApi NuGet软件包。 然后,您可以简单地按照NuGet包中的说明注册类型并注册依赖项解析器,如下所示:
using Unity.AspNet.WebApi;
config.DependencyResolver = new UnityDependencyResolver(container);
链接到NuGet软件包: https : //github.com/unitycontainer/aspnet-webapi
这是3个步骤:
GlobalConfiguration
似乎您尚未添加解析代码,以上解决方案也未添加。
在将DependencyResolver
附加到GlobalConfiguration
之前,添加此行。
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
您需要将Unity设置为WebAPI的依赖项解析器。
将以下NuGet程序包添加到您的项目中: https : //www.nuget.org/packages/Unity.WebAPI/
然后配置WebAPI以使用正确的解析器,将以下内容添加到WebApiConfig.cs中
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
我有同样的问题。 对我来说,解决此确切错误的方法是,所有其他控制器构造函数也在请求时加载。 其中之一在构造函数中没有有效的参数。 它尚未在Unity中注册。
所以我从Unity那里获得了解析失败的机会。
但是在修复了其他控制器后,一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.