使用Unity在WebAPI中注入依赖项

BAD*_*EED 3 c# unity-container asp.net-web-api

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

public class MyController : ApiController
{
    private IRepository repository;

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

    // REST implementations
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后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
    } 
}
Run Code Online (Sandbox Code Playgroud)

最后我有一个Startup.cs:

[assembly: OwinStartup(typeof(Path.To.Startup))]
namespace ZeroCode.ConfigurazioneServizio.Web.Api
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            new Mapping().Bootstrap();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说一切看起来都很好,代码构建,我可以启动控制器,但是一旦我发出请求,我得到错误导致无参数构造函数不存在.所以我添加了默认构造函数,但这将实例化控制器,因此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);
    }
}
Run Code Online (Sandbox Code Playgroud)

此时我已修改WebApiConfig.cs插入此行

config.Services.Replace(typeof(IHttpControllerActivator), new UnityHttpControllerActivator(container));
Run Code Online (Sandbox Code Playgroud)

config.DependencyResolver此之后,但这不解决问题,并在Create方法内引发异常.我不知道还能做些什么.

Jon*_*lis 14

有一个很好的小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
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以绕过额外的类和web.config更改.


Har*_*eem 5

第一个答案指出要添加Unity.WebApi。它是正确的。添加此软件包后,请按照本链接在项目中一起使用Unity.Mvc5和Unity.WebApi所述使用它。我确实喜欢这样,我的问题就解决了。