使用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方法内部引发了异常。我不知道还能做什么。

使用Unity在WebAPI中注入依赖项

有一个不错的小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步过程:

  1. 寄存器
  2. 解决
  3. 将解析器链接到GlobalConfiguration

您似乎没有添加解析代码,上述解决方案也没有。

在将DependencyResolver附加到GlobalConfiguration之前添加此行。

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

我也遇到了同样的问题。对我来说,这个确切错误的解决方案是,所有其他控制器构造函数也在请求时加载。其中一个在构造函数中没有有效的参数。它没有在Unity注册。

所以我从Unity那里得到了失败的决议。

但在修复了另一个控制器后,一切都正常了。