首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Unity在WebAPI中注入依赖项

使用Unity在WebAPI中注入依赖项
EN

Stack Overflow用户
提问于 2015-11-24 23:04:50
回答 6查看 26.9K关注 0票数 4

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

代码语言:javascript
复制
public class MyController : ApiController
{
    private IRepository repository;

    public MyController(IRepository repository) 
    {
        this.repository = repositor;
    }

    // REST implementations
}

WebApiConfig的配置如下:

代码语言:javascript
复制
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中,我有类似这样的东西:

代码语言:javascript
复制
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

代码语言:javascript
复制
[assembly: OwinStartup(typeof(Path.To.Startup))]
namespace ZeroCode.ConfigurazioneServizio.Web.Api
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            new Mapping().Bootstrap();
        }
    }
}

对我来说,一切看起来都很好,代码构建好了,我可以启动控制器了,但是当我发出一个请求时,我得到了错误,因为无参数的构造器不存在。因此,我添加了默认构造函数,但这将实例化控制器,因此IRepository永远不会被注入。

我一直在寻找一个可能的解决方案。他们中的一个试图实现IHttpControllerActivator,所以我意识到了如下所示:

代码语言:javascript
复制
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,插入了下面这一行

代码语言:javascript
复制
config.Services.Replace(typeof(IHttpControllerActivator), new UnityHttpControllerActivator(container));

紧接在config.DependencyResolver之后,但这并不能解决问题,并且在Create方法中引发异常。我不知道我还能做什么。

EN

回答 6

Stack Overflow用户

发布于 2015-11-24 23:12:36

有一个很好的小Nuget包-- Unity.Webapi。如果你添加了它,你可以简单地把你的容器插入你的HttpConfiguration

代码语言:javascript
复制
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更改。

票数 18
EN

Stack Overflow用户

发布于 2017-11-01 18:07:05

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

票数 5
EN

Stack Overflow用户

发布于 2019-02-07 08:32:17

对于unity版本5或更高版本,您必须添加Unity.AspNet.WebApi NuGet包。然后,您可以简单地按照NuGet包中的说明注册您的类型并注册依赖关系解析器,如下所示:

代码语言:javascript
复制
using Unity.AspNet.WebApi;
config.DependencyResolver =  new UnityDependencyResolver(container);

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33897049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档