我有一个(应该)看起来像这样的 WebAPI Controller :
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();
}
}
}
对我来说,一切看起来都很好,代码已构建,我可以启动 Controller ,但是一旦我发出请求,我就会收到错误消息,因为无参数构造函数不存在。
所以我添加了默认构造函数,但这将实例化 Controller ,因此永远不会注入(inject) 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 更改。
关于c# - 使用 Unity 在 WebAPI 中注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33897049/