【发布时间】:2017-08-04 14:19:43
【问题描述】:
我正在做一个带有 API2 控制器应用程序的 MVC 5。
我有一个在同一个项目中调用 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,我必须包含
使用 System.Web.Mvc;
当我包含该引用时,System.Web.Http; 不起作用。
另一种选择是像这样在 API 控制器构造函数中设置 de DI
private IContactRepository _sessionRepository;
public ApiController(IContactRepository contactRepository)
{
_contactRepository = contactRepository;
}
所以我避免使用DependencyResolver。但我必须在控制器构造函数中使用参数。
在我这样调用 Api 控制器的控制器上。
var webApi = new APIController();
model.CantMensajeByUser = webApi.CountMensajeByUser(10);
我不使用参数的地方。
正确的做法是什么?
【问题讨论】:
-
您混淆了这个概念。您建议的第一个 sn-p 使用了 Service Locator 反模式。显式构造函数注入是可行的方法,但无需在 Controller 中创建 ApiController。只需在服务中具有功能并将服务注入控制器即可。如果 Web API 与 MVC 控制器共享同一个项目,则 DRY,重用服务。
标签: asp.net-mvc api dependency-injection http-post