我有一个问题,我不知道如何解决。我有一个容器,其中包含我使用WebApi公开的不同服务的不同接口。问题是我需要在我的控制器中获取依赖项,我必须避免使用静态。我读到了这个
http://beletsky.net/2011/10/inside-aspnet-mvc-idependencyresolver.html
http://www.asp.net/web-api/overview/advanced/dependency-injection
在asp.net中,我读到我可以实现自己的IDependencyResolver。这是疯了吗?因为我搜索了很多,我只找到了使用Unity的例子。如果我不想使用该依赖注入器?它实现这一目标的最佳途径是什么?。
public class MyController: ApiController
{
private InterfaceService m_interfaceService; //This is the dependency I need
public MyController()
{
}
[HttpGet]
[Route("myServices/")]
public List<IServiceCategory> GetServiceObjectsList()
{
return m_interfaceServices.GetObjectsList();
}
}
答案 0 :(得分:1)
所以你有一个预先存在的容器/依赖机制!你应该问你的团队为什么做出类似的东西是个好主意,而不是在.net世界中使用所有好的东西。
尽管如此,来自文档:
http://www.asp.net/web-api/overview/advanced/dependency-injection
虽然您可以编写完整的IDependencyResolver实现 从头开始,界面真的被设计成充当桥梁 在Web API和现有的IoC容器之间。
该页面上的Unity示例显示了为弥合Unity DI框架和Web mvc之间的差距必须采取的措施。你只需要用自制卷轴做同样的事情。实现几个方法的问题。去吧!
答案 1 :(得分:1)
以下是符合您要求的实施方案:
namespace AdvancedDI.Controllers
{
public class ProductController : ApiController
{
public IFactory iFactory { get; set; }
protected override void Initialize(HttpControllerContext controllerContext)
{
DIAPP.GetContainer(this);
base.Initialize(controllerContext);
}
public IHttpActionResult Get()
{
var response = iFactory.DoWork();
return Ok(response);
}
protected override void Dispose(bool disposing)
{
DIAPP.Dispose(this);
base.Dispose(disposing);
}
}
}
这是一种基于财产的注射。可以使用UnityContainerExtensions
。在Initialize
之前将调用Get
方法。
第1步。DIAPP.GetContainer(this)
包含整个productController
上下文。
第2步。GetContainer
从中收到IFactory
属性信息。
第3步。接下来,您有机会收到此IBuilderContext
的统一IFactory
。
答案 2 :(得分:0)
我已经使用Ninject和AutoFac进行依赖注入。这不是疯狂,这是常见的做法。