使用Unity在WebAPI中注入依赖项

时间:2015-11-24 15:04:50

标签: c# asp.net-web-api unity-container

我有一个(应该)看起来像这样的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方法中引发了异常。我不知道还能做些什么。

6 个答案:

答案 0 :(得分:12)

这是一个不错的小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更改。

答案 1 :(得分:4)

第一个答案表示添加 Unity.WebApi 。它是正确的。添加此软件包后,请按照此链接Using Unity.Mvc5 and Unity.WebApi together in a project中的说明使用它。我确实喜欢这个,我的问题解决了。

答案 2 :(得分:2)

对于统一版本5或更高版本,您将必须添加 Unity.AspNet.WebApi NuGet程序包。然后,您只需按照NuGet软件包中的说明注册类型,然后注册依赖项解析器,如下所示:

using Unity.AspNet.WebApi;
config.DependencyResolver =  new UnityDependencyResolver(container);

链接到NuGet软件包:https://github.com/unitycontainer/aspnet-webapi

答案 3 :(得分:1)

这是三步过程:

  1. 注册
  2. 解决
  3. 将解析器链接到func normalizeArray<T: Comparable & Numeric>(a: [T]) -> [T] { let min: T = a.min()! let max: T = a.max()! let n = a.map({ ($0 - min) / (max - min) }) <--- Binary operator '/' cannot be applied to two 'T' operands return n }
  4. 您似乎没有添加解析代码,上述解决方案也没有。

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

    GlobalConfiguration

答案 4 :(得分:0)

您需要将Unity设置为WebAPI的依赖项解析程序。

将以下NuGet包添加到您的项目中:https://www.nuget.org/packages/Unity.WebAPI/

然后配置WebAPI以使用正确的解析程序将以下内容添加到WebApiConfig.cs

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

答案 5 :(得分:0)

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

所以我从Unity那里得到了解决方案。

但是在修好了其他控制器后,一切都运转了。