0

我想注入統一容器到WebController。注入依賴到Web API控制器

我有UnityDependencyResolver:

public class UnityDependencyResolver : IDependencyResolver 
{ 
    readonly IUnityContainer _container; 

    public UnityDependencyResolver(IUnityContainer container) 
    { 
    this._container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return _container.Resolve(serviceType); 
     } 
     catch 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return _container.ResolveAll(serviceType); 
     } 
     catch 
     { 
      return new List<object>(); 
     } 
    } 

    public void Dispose() 
    { 
     _container.Dispose(); 
    } 
} 

然後,在我的Global.asax我添加以下行:

var container = new UnityContainer(); 
container.RegisterType<IService, Service> 
(new PerThreadLifetimeManager()).RegisterType<IDALContext, DALContext>(); 
DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

然後,如果我使用的網絡控制器執行以下操作:

private IService _service; 

public HomeController(IService srv) 
{ 
    _service = srv; 
} 

它工作正常。

但我想它注入到的WebAPI控制器,所以如果我做同樣的方式:

private IService _service; 

public ValuesController(IService srv) 
{ 
    _service = srv; 
} 

它不工作,它說,構造函數沒有定義。 好吧,我再創建一個構造函數:

public ValuesController(){} 

而且在這種情況下,僅使用此構造,從來沒有一個地方我應該團結注入容器。

請指教。

+0

這是一個的WebAPI項目或恰好有一個API控制器MVC應用程序。 – jpgrassi

+0

這是一個具有API控制器的MVC項目。 –

回答

0

在WebApiConfig補充一點:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Routes and other stuff here... 

     var container = IocContainer.Instance; // Or any other way to fetch your container. 
     config.DependencyResolver = new UnityDependencyResolver(container); 
    } 
} 

如果你想在同一個容器,你可以把它在一個靜態變量,像這樣:

public static class IocContainer 
{ 
    private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer(); 
     return container; 
    }); 

    public static IUnityContainer Instance 
    { 
     get { return Container.Value; } 
    } 
} 

更多信息可以在這裏找到:

http://www.asp.net/web-api/overview/advanced/dependency-injection

在一個旁註,我也可以推薦個e nuget-package Unity.Mvc。它增加了一個UnityWebActivator和支持PerRequestLifetimeManager

https://www.nuget.org/packages/Unity.Mvc/