簡體   English   中英

使用Unity在WebAPI中注入依賴項

[英]Inject dependencies in a WebAPI with Unity

我有一個(應該)如下所示的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方法內引發了異常。 我不知道還能做什么。

有一個不錯的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來使用它。 我確實喜歡這樣,我的問題就解決了。

對於版本5或更高版本,您必須添加Unity.AspNet.WebApi NuGet軟件包。 然后,您可以簡單地按照NuGet包中的說明注冊類型並注冊依賴項解析器,如下所示:

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

鏈接到NuGet軟件包: https : //github.com/unitycontainer/aspnet-webapi

這是3個步驟:

  1. 寄存器
  2. 解決
  3. 將解析器鏈接到GlobalConfiguration

似乎您尚未添加解析代碼,以上解決方案也未添加。

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

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

您需要將Unity設置為WebAPI的依賴項解析器。

將以下NuGet程序包添加到您的項目中: https : //www.nuget.org/packages/Unity.WebAPI/

然后配置WebAPI以使用正確的解析器,將以下內容添加到WebApiConfig.cs中

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

我有同樣的問題。 對我來說,解決此確切錯誤的方法是,所有其他控制器構造函數也在請求時加載。 其中之一在構造函數中沒有有效的參數。 它尚未在Unity中注冊。

所以我從Unity那里獲得了解析失敗的機會。

但是在修復了其他控制器后,一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM