注入依赖于使用Unity的Web API

问题描述 投票:3回答:6

我有(应该)看起来像这样一个Web API控制器:

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方法内。我不知道还有什么我能做的。

c# asp.net-web-api unity-container
6个回答
13
投票

有一个可爱的小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中的变化。


4
投票

第一个答案状态添加Unity.WebApi。它是正确的。加入这个包后把它作为在此链接Using Unity.Mvc5 and Unity.WebApi together in a project进行说明。我不喜欢这样,我的问题得到解决。


2
投票

随着5或更高版本团结,你就必须添加Unity.AspNet.WebApi NuGet包。然后,你可以简单地遵循NuGet包的说明注册类型和注册你的依赖解析器像下面:

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

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


1
投票

这是3个步骤:

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

您似乎没有添加解决代码也不认为上述解决方案。

连接DependencyResolverGlobalConfiguration之前添加此行。

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

0
投票

您需要建立统一的依赖解析器为的WebAPI。

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

然后配置Web API的使用权分解添加以下到您的WebApiConfig.cs

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

0
投票

我有同样的问题。对我来说,要解决这个确切的错误是,所有其他的控制器构造也被在请求时加载。其中一人有没有在构造一个有效的参数。它不是用统一注册。

所以我就从分辨率团结失败。

但固定后,其他控制器一切正常散热片。

© www.soinside.com 2019 - 2024. All rights reserved.