2017-08-04 62 views
0

我正在做一個MVC 5與API2控制器應用程序。mvc api控制器依賴注入System.Web.Http和System.Web.Mvc引用錯誤

我有一個控制器,在同一個項目中調用ApiController。 在我的Api控制器方法中,我想使用DI。

看起來像這樣。

 [ActionName("Method1")] 
 
     [HttpPost] 
 
     public int Method1(long User_id) 
 
     { 
 
      long user_id = Newtonsoft.Json.JsonConvert.DeserializeObject<long>(User_id.ToString()); 
 
      IContactRepository _contactRepository = DependencyResolver.Current.GetService<IContactRepository>(); 
 
      return _contactRepository.Get_CountMensajeByUser(user_id); 
 
      
 
     }

爲了使用

[ActionName( 「RetProduct」)]和[HttpPost]

我必須包括using System.Web.Http;參考

但是,另一方面,爲了使用DependencyResolver我必須包括

using System.Web.Mvc;

當我包含該引用時,System.Web.Http;不起作用。

另一種替代方法是設置德DI的API的控制器構造在這樣

private IContactRepository _sessionRepository; 
 
     public ApiController(IContactRepository contactRepository) 
 
     { 
 
      _contactRepository = contactRepository; 
 
      
 
     }

所以我避免使用DependencyResolver。但是我必須在Controller構造函數中使用參數。 在我的控制器上,我這樣稱呼Api控制器。

var webApi = new APIController(); 
 
       model.CantMensajeByUser = webApi.CountMensajeByUser(10);

如果我不使用參數。

什麼是正確的做法?

+0

你混淆了這個概念。您建議使用Service Locator反模式的第一個片段。顯式構造函數注入是要走的路,但不需要在Controller中創建ApiController。只需具備服務中的功能並將服務注入Controller即可。如果Web API與MVC控制器共享相同的項目,則DRY將重用這些服務。 – Nkosi

回答

1

我認爲你想解決的問題更簡單的解決方案是使用實際的IoC容器。對於C#.NET來說,Ninject非常易於使用,最好的部分是您可以在一個文件中解析所有依賴關係,而不是在業務邏輯中執行這些操作。

我鼓勵你查看http://www.ninject.org/